iOS Tips #3 NSNumberFormatterで数値を文字列に変換する
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); // 「centoventitré milioni quattrocentocinquantaseimilasettecentottantanove」が出力される
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以外使ったことがなかったので勉強になりました!標準で実装されているクラスもなかなか奥が深いです。