iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど
前回紹介した方法だと上手くいかない事が分かったので、紹介する。
フォーマッタを通した後だと、装飾的な文字が追加されるし、元の文字列と、置換される文字列を個別に評価するのは面倒なので、くっつけた後、評価するようにした。以下は、n桁の数値のみの場合。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
NSMutableString *text = [textField.text mutableCopy];
[text replaceCharactersInRange:range withString:string];
/* クリア(空文字) */
if (0 == text.length) {
return YES;
}
/* n桁 */
if (n < text.length) {
return NO;
}
/* 数字 */
NSCharacterSet *digitCharSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789"];
NSScanner *scanner = [NSScanner localizedScannerWithString:text];
[scanner setCharactersToBeSkipped:nil];
[scanner scanCharactersFromSet:digitCharSet intoString:NULL];
if (![scanner isAtEnd]) {
return NO;
}
return YES;
}
これを金額に変換するメソッドは、以下のとおり。
- (NSString *)stringFromDecimalNumber:(NSDecimalNumber *)decimalNumber
{
NSNumberFormatter *numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setNumberStyle:NSNumberFormatterCurrencyStyle];
[numberFormatter setCurrencyCode:@"JPY"];
NSString *s = [numberFormatter stringFromNumber:decimalNumber];
return s;
}