Создавая и Используя объекты 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. Версия стандарта меняется в зависимости от выпуска операционной системы:

Например, указывая строку формата как "$#,##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