Создавая и Используя объекты CFNumberFormatter
Средства форматирования числа форматируют текстовое представление объектов числа и преобразовывают текстовые представления числовых значений в объекты числа. Представление охватывает целые числа, плавания, и удваивается; плавания и удваиваются, может быть отформатирован к указанному десятичному разряду. Вы создаете объекты средства форматирования числа путем указания стиля нумерации, можно также указать пользовательскую строку формата.
Создание средств форматирования числа
Для создания CFNumberFormatter необходимо указать локаль и стиль средства форматирования, столь же проиллюстрированный в Перечислении 1 или строке формата, как показано в Перечислении 2. Стили форматирования не указывают точный формат — они зависят от локали, настроек пользовательской настройки и версии операционной системы. Если Вы хотите указать точный формат, используйте CFNumberFormatterSetFormat
функционируйте для установки строки формата, и CFNumberFormatterSetProperty
функционируйте для изменения определенных свойств, таких как разделители, «Не число» символ и дополнительный символ.
Пример кода перечисления 1, показывающий, как создать средство форматирования числа с помощью стиля средства форматирования
float aFloat = 1234.567; |
int fractionDigits = 2; |
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); |
CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate |
(NULL, currentLocale, kCFNumberFormatterDecimalStyle); |
CFNumberRef maxFractionDigits = CFNumberCreate |
(NULL, kCFNumberIntType, &fractionDigits); |
CFNumberFormatterSetProperty |
(numberFormatter, kCFNumberFormatterMaxFractionDigits, maxFractionDigits); |
CFStringRef formattedNumberString = CFNumberFormatterCreateStringWithValue |
(NULL, numberFormatter, kCFNumberFloatType, &aFloat); |
CFShow(formattedNumberString); |
// Memory management |
CFRelease(currentLocale); |
CFRelease(numberFormatter); |
CFRelease(maxFractionDigits); |
CFRelease(formattedNumberString); |
// Output (for en_US_POSIX locale): 1234.57 |
Пример кода перечисления 2, показывающий, как создать средство форматирования числа с помощью строки средства форматирования
float aFloat = 1234.567; |
CFStringRef frLocaleIdentifier = CFSTR("fr_FR"); |
CFLocaleRef frLocale = CFLocaleCreate(NULL, frLocaleIdentifier); |
CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate |
(NULL, frLocale, kCFNumberFormatterNoStyle); |
CFStringRef formatString = CFSTR("#.##"); |
CFNumberFormatterSetFormat(numberFormatter, formatString); |
CFStringRef formattedNumberString = CFNumberFormatterCreateStringWithValue |
(NULL, numberFormatter, kCFNumberFloatType, &aFloat); |
CFShow(formattedNumberString); |
// Memory management |
CFRelease(frLocale); |
CFRelease(numberFormatter); |
CFRelease(formattedNumberString); |
// Output (for fr_FR locale -- note "," decimal separator): 1234,57 |
Следующий фрагмент кода создает средство форматирования числа, форматирующее числа как проценты с помощью kCFNumberFormatterPercentStyle
стиль нумерации. В этом примере, CFNumberFormatterCreateStringWithNumber
функция преобразовывает числовое значение 0.2
к текстовому представлению "20%"
.
// Creating a number formatter |
float percent = 0.20; |
CFNumberFormatterRef numberFormatter = CFNumberFormatterCreate |
(NULL, currentLocale, kCFNumberFormatterPercentStyle); |
CFNumberRef number = CFNumberCreate(NULL, kCFNumberFloatType, &percent); |
CFStringRef numberString = CFNumberFormatterCreateStringWithNumber |
(NULL, numberFormatter, number); |
Используя стили числового формата
CFNumberFormatter определяет несколько стилей форматирования. Вы устанавливаете стиль средства форматирования при создании средства форматирования. Пример кода, показанный в Перечислении 3, форматирует числовое значение с помощью десятичного числа, процента, валюты и стилей экспоненциального представления. (Выходной формат зависит от пользовательской настройки, так может варьироваться по Вашему приложению.)
Перечисление 3 , Сравнивающее стили числового формата
float n = 1.20; |
CFNumberRef value = CFNumberCreate(NULL, kCFNumberFloatType, &n); |
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); |
// Create different number formatters |
CFNumberFormatterRef decimalFormatter = CFNumberFormatterCreate |
(NULL, currentLocale, kCFNumberFormatterDecimalStyle); |
CFNumberFormatterRef currencyFormatter = CFNumberFormatterCreate |
(NULL, currentLocale, kCFNumberFormatterCurrencyStyle); |
CFNumberFormatterRef percentFormatter = CFNumberFormatterCreate |
(NULL, currentLocale, kCFNumberFormatterPercentStyle); |
CFNumberFormatterRef scientificFormatter = CFNumberFormatterCreate |
(NULL, currentLocale, kCFNumberFormatterScientificStyle); |
// Create formatted strings |
CFStringRef decimalString = CFNumberFormatterCreateStringWithNumber |
(NULL, decimalFormatter, value); |
CFStringRef currencyString = CFNumberFormatterCreateStringWithNumber |
(NULL, currencyFormatter, value); |
CFStringRef percentString = CFNumberFormatterCreateStringWithNumber |
(NULL, percentFormatter, value); |
CFStringRef scientificString = CFNumberFormatterCreateStringWithNumber |
(NULL, scientificFormatter, value); |
// Print formatted strings to stdout |
fprintf(stdout, "Decimal formatted number = %s\n", |
CFStringGetCStringPtr(decimalString, CFStringGetSystemEncoding())); |
fprintf(stdout, "Currency number = %s\n", |
CFStringGetCStringPtr(currencyString, CFStringGetSystemEncoding())); |
fprintf(stdout, "Percent formatted number = %s\n", |
CFStringGetCStringPtr(percentString, CFStringGetSystemEncoding())); |
fprintf(stdout, "Scientific formatted number = %s\n", |
CFStringGetCStringPtr(scientificString, CFStringGetSystemEncoding())); |
// Memory management |
CFRelease(currentLocale); |
CFRelease(decimalFormatter); |
CFRelease(currencyFormatter); |
CFRelease(percentFormatter); |
CFRelease(scientificFormatter); |
CFRelease(decimalString); |
CFRelease(currencyString); |
CFRelease(percentString); |
CFRelease(scientificString); |
// Output (for en_US_POSIX locale) |
Decimal formatted number = 1.2 |
Currency number = $1.20 |
Percent formatted number = 120% |
Scientific formatted number = 1.20000004768372E0 |
Пользовательские свойства средства форматирования
Как правило, Вы призваны использовать предопределенные стили, локализующиеся системой. Если Вы хотите, однако, можно изменить свойства средств форматирования числа с помощью CFNumberFormatterSetProperty
функция — видит CFNumberFormatterRef
для полного списка свойств, которые могут быть изменены с помощью этой функции. Например, можно установить десятичный разделитель в запятую, как показано в следующем фрагменте кода.
CFNumberFormatterRef decimalFormatter = CFNumberFormatterCreate |
(NULL, currentLocale, kCFNumberFormatterDecimalStyle); |
CFNumberFormatterSetProperty(decimalFormatter, |
kCFNumberFormatterDecimalSeparator, CFSTR(",")); |
Используя средство форматирования decimalFormatter
выше, можно преобразовать числовое значение 1.2
к текстовому представлению 1,2
.
Если Вы хотите указать точный формат, используйте CFNumberFormatterSetFormat
функционируйте для установки строки формата. Строка формата использует образцы формата из Технического стандарта № 35 Unicode. Версия стандарта меняется в зависимости от выпуска операционной системы:
OS X v10.9 и iOS 7 использует версию tr35-31.
OS X v10.8 и iOS 6 использует версию tr35-25.
iOS 5 использует версию tr35-19.
OS X v10.7 и iOS 4.3 использует версию tr35-17.
iOS 4.0, iOS 4.1 и iOS 4.2 используют версию tr35-15.
iOS 3.2 использует версию tr35-12.
OS X v10.6, iOS 3.0 и iOS 3.1 использует версию tr35-10.
OS X v10.5 использует версию tr35-6.
OS X v10.4 использует версию tr35-4.
Например, указывая строку формата как "$#,##0.00"
текстовые представления доходов такой как "$156.30"
.
Пример кода, показанный в Перечислении 4, форматирует различное использование числовых значений "$#,##0.00"
как строка формата для валютных ценностей.
Перечисление 4 Используя строки числового формата
CFLocaleRef currentLocale = CFLocaleCopyCurrent(); |
CFNumberFormatterRef customCurrencyFormatter = CFNumberFormatterCreate |
(NULL, currentLocale, kCFNumberFormatterCurrencyStyle); |
CFNumberFormatterSetFormat(customCurrencyFormatter, CFSTR("$#,##0.00")); |
float n1 = 6.3; |
CFNumberRef number1 = CFNumberCreate(NULL, kCFNumberFloatType, &n1); |
float n2 = 156.3; |
CFNumberRef number2 = CFNumberCreate(NULL, kCFNumberFloatType, &n2); |
float n3 = 1156.372; |
CFNumberRef number3 = CFNumberCreate(NULL, kCFNumberFloatType, &n3); |
CFStringRef string1 = CFNumberFormatterCreateStringWithNumber |
(NULL, customCurrencyFormatter, number1); |
CFStringRef string2 = CFNumberFormatterCreateStringWithNumber |
(NULL, customCurrencyFormatter, number2); |
CFStringRef string3 = CFNumberFormatterCreateStringWithNumber |
(NULL, customCurrencyFormatter, number3); |
fprintf(stdout, "Format of %f = %s\n", |
n1, CFStringGetCStringPtr(string1, CFStringGetSystemEncoding())); |
fprintf(stdout, "Format of %f = %s\n", |
n2, CFStringGetCStringPtr(string2, CFStringGetSystemEncoding())); |
fprintf(stdout, "Format of %f = %s\n\n", |
n3, CFStringGetCStringPtr(string3, CFStringGetSystemEncoding())); |
// Memory management |
CFRelease(currentLocale); |
CFRelease(customCurrencyFormatter); |
CFRelease(number1); |
CFRelease(number2); |
CFRelease(number3); |
CFRelease(string1); |
CFRelease(string2); |
CFRelease(string3); |
// Output (for en_US_POSIX locale) |
Format of 6.300000 = $6.30 |
Format of 156.300003 = $156.30 |
Format of 1156.371948 = $1,156.37 |