iOS Tips #3 NSNumberFormatterで数値を文字列に変換する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

NSNumberFormatterはNSNumberを任意の形式の文字列に変換してくれるクラスです。実際にNSNumberFormatterを使用してNSNumberを3桁カンマ区切りの文字列に変換するには以下のように行います。

// 変換対象のNSNumber
NSNumber *number = @123456789;

// NSNumberFormatterを生成
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

// NSNumberを3桁区切りに変換
formatter.numberStyle = NSNumberFormatterDecimalStyle;
NSString *formattedNumber = [formatter stringFromNumber:number];

// コンソールに出力
NSLog(@"result: %@", formattedNumber); // 「result: 123,456,789」が出力される

このように3桁カンマ区切りにするのに皆さんもつかったことがあると思いますが、実はNSNumberFormatterのnumberStyleを変更することで3桁区切り以外のフォーマットも可能です!

NSNumberFormatterのnumberStyleに指定できる値

NSNumberFormatterDecimalStyle以外にnumberStyleに指定できる値を以下にまとめてみました。

NSNumberFormatterNoStyle

特にスタイルを指定しない場合に使用します。ただ、NSNumberには- (NSString *)stringValueメソッドがあるので使いどころはなさそうな気がします。

// 変換対象のNSNumber
NSNumber *number = @123456789;

// NSNumberFormatterを生成
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

// スタイル指定なし
formatter.numberStyle = NSNumberFormatterNoStyle;
NSString *formattedNumber = [formatter stringFromNumber:number];

// コンソールに出力
NSLog(@"result: %@", formattedNumber); // 「result: 123456789」が出力される

// NSLog(@"result: %@", number.stringValue);でも同様の結果が得られる

NSNumberFormatterSpellOutStyle

こいつが非常に面白くて、NSNumberをlocaleで指定されたロケールに応じた言語に変換してくれます。

// NSNumberFormatterを生成
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

// 変換対象のNSNumber
NSNumber *number = @123456789;

// NSNumberを3桁区切りに変換
formatter.numberStyle = NSNumberFormatterSpellOutStyle;

NSString *formattedNumber;

// ロケールにja_JPを指定
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"];
formattedNumber = [formatter stringFromNumber:number];
NSLog(@"result(ja_JP): %@", formattedNumber); // 「一億二千三百四十五万六千七百八十九」が出力される

// ロケールにen_USを指定
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
formattedNumber = [formatter stringFromNumber:number];
NSLog(@"result(en_US): %@", formattedNumber); // 「one hundred twenty-three million four hundred fifty-six thousand seven hundred eighty-nine」が出力される

// ロケールにit_ITを指定
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"it_IT"];
formattedNumber = [formatter stringFromNumber:number];
NSLog(@"result(it_IT): %@", formattedNumber); // 「cento­venti­tré milioni quattro­cento­cinquanta­sei­mila­sette­cent­ottanta­nove」が出力される

NSNumberFormatterCurrencyStyle

このスタイルを指定するとlocaleで指定されたロケールに応じた通貨形式に変換してくれます。

// NSNumberFormatterを生成
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

// 変換対象のNSNumber
NSNumber *number = @123456789;

// 通貨形式に変換
formatter.numberStyle = NSNumberFormatterCurrencyStyle;

NSString *formattedNumber;

// ロケールにja_JPを指定
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"ja_JP"];
formattedNumber = [formatter stringFromNumber:number];
NSLog(@"result(ja_JP): %@", formattedNumber); // 「¥123,456,789」が出力される

// ロケールにen_USを指定
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
formattedNumber = [formatter stringFromNumber:number];
NSLog(@"result(en_US): %@", formattedNumber); // 「$123,456,789.00」が出力される

// ロケールにit_ITを指定
formatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"it_IT"];
formattedNumber = [formatter stringFromNumber:number];
NSLog(@"result(it_IT): %@", formattedNumber); // 「€ 123.456.789,00」が出力される

NSNumberFormatterPercentStyle

このスタイルを指定するとNSNumberを%表現した文字列に変換してくれます。

// 変換対象のNSNumber
NSNumber *number = @0.7482;

// NSNumberFormatterを生成
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

// %形式
formatter.numberStyle = NSNumberFormatterPercentStyle;
NSString *formattedNumber = [formatter stringFromNumber:number];

// コンソールに出力
NSLog(@"result: %@", formattedNumber); // 「75%」が出力される

NSNumberFormatterScientificStyle

このスタイルを指定すると桁が大きい時にべき乗で表現した文字列に変換してくれます。

// 変換対象のNSNumber
NSNumber *number = @123456789;

// NSNumberFormatterを生成
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];

// 科学形式
formatter.numberStyle = NSNumberFormatterScientificStyle;
NSString *formattedNumber = [formatter stringFromNumber:number];

// コンソールに出力
NSLog(@"result: %@", formattedNumber); // 「1.23456789E8」が出力される

まとめ

私自身SNumberFormatterDecimalStyle以外使ったことがなかったので勉強になりました!標準で実装されているクラスもなかなか奥が深いです。

参考