CFNumberFormatter オブジェクトの作成と使用
数値書式は、数値オブジェクトのテキスト表現を書式化し、数値のテキスト表現を数値オブジェクトに変換します。表現には、整数、浮動小数点数、および double が含まれます。浮動小数点数および double は、指定された小数点以下の桁数に書式化できます。数字のスタイルを指定して数値書式オブジェクトを作成し、カスタム書式文字列を指定することもできます。
数値書式の作成
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 に示すコードサンプルは、10進数、パーセント、通貨、および科学記法スタイルを使用して数値をフォーマットします。(出力形式はユーザーの環境設定によって異なりますので、アプリケーションによって異なります)。
リスト 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 関数を使用して書式文字列を設定して下さい。書式文字列は、Unicode 技術標準#35 の書式パターンを使用します。標準のバージョンは、オペレーティングシステムのリリースによって異なります。
- 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
前の章 次の章