トップ «前の日記(2012-08-12) 最新 次の日記(2012-09-18)» 編集

Cocoa練習帳

iOS/iPhone/iPad/watchOS/tvOS/MacOSX/Android プログラミング, Objective-C, Cocoa, Swiftなど

2012|01|02|03|04|05|06|07|08|09|10|11|12|
2013|01|02|03|04|05|06|07|08|09|10|11|12|
2014|01|02|03|04|05|06|07|08|09|10|11|12|
2015|01|02|03|04|05|06|07|08|09|10|11|12|
2016|01|02|03|04|05|06|07|08|09|10|11|12|
2017|01|02|03|04|05|06|07|08|09|10|11|12|
2018|01|02|03|04|05|06|07|08|09|10|11|12|
2019|01|02|03|04|05|06|07|08|09|10|11|12|
2020|01|02|03|04|05|06|

2012-08-13 [iOS]入力制限(2)

前回紹介した方法だと上手くいかない事が分かったので、紹介する。

フォーマッタを通した後だと、装飾的な文字が追加されるし、元の文字列と、置換される文字列を個別に評価するのは面倒なので、くっつけた後、評価するようにした。以下は、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;
}

_ 【Cocoa練習帳】

http://www.bitz.co.jp/weblog/
http://ameblo.jp/bitz/(ミラー・サイト)

トップ «前の日記(2012-08-12) 最新 次の日記(2012-09-18)» 編集