数値書式
NSNumberFormatter は、stringFromNumber: と numberFromString: の 2 つの便利なメソッドを提供します。これは、それぞれ数値の文字列表現を作成し、文字列から数値オブジェクトを作成するために使用できます。書式オブジェクトを作成せずに数値のローカライズされた文字列表現を作成するには、クラスメソッドの localizedStringFromNumber:numberStyle: を使用できます。
(getObjectValue:forString:errorDescription :などの) NSFormatter から継承されたメソッドに加えて、文字列を解析する際に高度な要件がある場合は、getObjectValue:forString:range:error: メソッドを使用して、解析されるべき文字列の部分文字列を指定し、実際に解析された文字列の範囲を返します。(障害のある場合は、障害が発生した場所を示します。) また、問題に関する豊富な情報を含む NSError オブジェクトを返します。
数値書式で取得および設定できる属性は多数あります。ユーザーに情報を提示するときは、通常、単に NSNumberFormatter スタイル定数を使用して、書式設定された数値の表示方法を決定する属性の事前定義セットを指定する必要があります。ただし、正確な書式の数値の表現を生成する必要がある場合は、書式文字列を使用する必要があります。
書式スタイルを使用してユーザーの設定で数値を表示
NSNumberFormatter は、"システム環境設定" の "インターナショナル設定" パネルで構成したユーザーの設定を使用して、さまざまな種類の数値を簡単にフォーマットできます。NSNumberFormatter スタイル定数、つまり NSNumberFormatterDecimalStyle、NSNumberFormatterCurrencyStyle、NSNumberFormatterPercentStyle、NSNumberFormatterScientificStyle、または NSNumberFormatterSpellOutStyle (数値のテキスト表現を生成します) これらはユーザーの設定に応じて数値を表示する方法を決定する属性のセットを指定します。
setNumberStyle: を使用して数値書式のスタイルを指定して下さい。リスト 1 は、書式スタイルを使用して日付をフォーマットする方法を示しています。
リスト 1 : 書式スタイルを使用した数値の書式設定
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.4563]; NSLog(@"formattedNumberString: %@", formattedNumberString); // Output for locale en_US: "formattedNumberString: formattedNumberString: 122,344.453"
書式文字列を使用してカスタム書式を指定
書式文字列は、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 を使用します。
Unicode 書式の文字列書式では、書式文字列内のリテラルテキストをアポストロフィ(' ') で囲む必要があります。
数値書式の書式文字列は、setPositiveFormat: および setNegativeFormat: を使用して指定して下さい。リスト 2 は、書式スタイルを使用して日付をフォーマットする方法を示しています。
リスト 2 : 書式文字列を使用して数値をフォーマット
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setPositiveFormat:@"###0.##"]; NSString *formattedNumberString = [numberFormatter stringFromNumber:@122344.4563]; NSLog(@"formattedNumberString: %@", formattedNumberString); // Output for locale en_US: "formattedNumberString: formattedNumberString: 122,344.45"
パーセント
"%" 文字で書式文字列を使用してパーセントをフォーマットすると、結果が混乱する可能性があります。以下の例を考えてみましょう。
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setPositiveFormat:@"0.00%;0.00%;-0.00%"]; NSLog(@"%@", [numberFormatter stringFromNumber:@4.0]); // Output: "400.00%".
書式文字列はパーセントを使用するように指定されているため、NSNumberFormatter は 4 を小数部として解釈し (ここで 1 は 100%)、それを (4 = 4/1 = 400%) のようにレンダリングします。
数値をパーセントで表現したい場合は、NSNumberFormatterPercentStyle のスタイルを使用する必要があります。これにより、パーセントがロケールに応じて適切にフォーマットされます。
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init]; [numberFormatter setNumberStyle:NSNumberFormatterPercentStyle]; NSLocale *usLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"]; [numberFormatter setLocale:usLocale]; NSLog(@"en_US: %@", [numberFormatter stringFromNumber:@4.0]); // Output: "en_US: 400%". NSLocale *faLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"fa_IR"]; [numberFormatter setLocale:faLocale]; NSLog(@"fa_IR: %@", [numberFormatter stringFromNumber:@4.0]); // Output: "fa_IR: ٪۴۰۰."
命名法
NSNumberFormatter には、インスタンスによって入力として許可される 小数点以下桁数 を管理するためのいくつかのメソッド (setMaximumFractionDigits など) が用意されています。"小数点以下桁数" は、小数点区切り文字の後の数字です (英語のロケールでは、小数点記号は通常 "小数点" と呼ばれます)。
前の章 次の章