ObjecTips

Swift & Objective-C で iOS とか macOS とか

NSString が数字のみで構成されているかを判定する その2

以前 NSCharacterSetdecimalDigitCharacterSet メソッドを使って文字列が数字のみを含んでいるかを調べるコードを書いた。
ここに少しコードを追加して文字列がローカライズとフォーマットされた数字表記のみを含んでいるかどうかを調べるコードにする。
具体的には 1,234,567.89 という表記の場合の千単位のコンマを許容するようにする。

まず NSCharacterSetdecimalDigitCharacterSet を使って NSMutableCharacterSet を作成する。
NSMutableCharacterSetaddCharactersInString: メソッドでセットに含む文字列を追加を追加できるのでこのメソッドで千単位の区切り文字を追加する。

この時 addCharactersInString:@"," のようにコンマ指定で文字列をキャラクターセットに追加してはいけない。
例えば英語表記とドイツ語表記では数字の区切りのコンマと小数点の区切りのピリオドの役割が逆になっている。

// en_US
1,234,567.89

// de_DE
1.234.567,89

これらの差異を吸収するのには NSNumberFormatter を使う。
NSNumberFormattergroupingSeparator プロパティが数字の区切り文字を返してくれるので以下のようにする。

    NSMutableCharacterSet *mCharacterSet = [NSMutableCharacterSet decimalDigitCharacterSet];
    [mCharacterSet addCharactersInString:numberFormatter.groupingSeparator];

ちなみに NSNumberFormatterdecimalSeparator プロパティは小数点の区切り文字列を返してくれる。

まとめ

文字列が数字と数字区切りのみで構成されているかを判定できるコードは以下