1

小数点を入力すると'。' 私のUITextFieldに、呼び出された数値フォーマッタは小数点を認識せず、小数点が入力されていないかのように続行します。つまり、200.9と入力した場合、小数点はテキストフィールドに表示されず、テキストフィールドのテキストは2009になります。

以下のように、小数点以下の桁数を2桁に制限したいと思います。これを引き起こすために私が何をしているのか教えてください。

- (BOOL) textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    BOOL isDeleting = [textField.text substringWithRange:range].length > string.length;
    int index = [textFields indexOfObject:textField];
    NSString *input;

    if (isDeleting == NO)
        input = [textField.text stringByAppendingString:string];
    else {
        NSMutableString *str = [textField.text mutableCopy];
        [str deleteCharactersInRange:range];
        input = [[str copy] autorelease];
        [str release];
    }

    if ([input isEqualToString:@"£"] || ([input isEqualToString:@""] && index != 1)) {
        [textField setText:@"£"];
    }
    else {
        if (index != 1)
            [textField setText:[self numberFormattedString:input]];
        else 
            [textField setText:input];
    }

    return NO;
}
- (NSString *) numberFormattedString:(NSString *)str {
    str = [str stringByReplacingOccurrencesOfString:@"£" withString:@""];
    str = [str stringByReplacingOccurrencesOfString:@"," withString:@""];
    NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
    [formatter setNumberStyle:NSNumberFormatterCurrencyStyle];
    NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en-UK"];
    [formatter setLocale:locale];
    [locale release];
    [formatter setAllowsFloats:YES];
    [formatter setMaximumFractionDigits:3];
    [formatter setMinimumFractionDigits:0];
    [formatter setDecimalSeparator:@"."];
    return [formatter stringFromNumber:[NSNumber numberWithFloat:[str floatValue]]];
}

TIA。

4

2 に答える 2

1

数値100を入力してから、小数点を入力するとします。numberFormattedStringが文字列とともに呼び出されると、£が削除£100.され、strにはfloat値100に変換される文字列が含まれ、100.最後に数値フォーマッタが小数点なし[str floatValue]の文字列として吐き出します。£100つまり、基本的に[str floatValue]は小数点を削除することです。

1つの解決策は、テキストフィールドデリゲートメソッドで置換文字列として小数点を取得するタイミングを確認し、その場合はnumberFormattedStringの呼び出しをスキップすることです。次に、ユーザーが次の桁を入力すると、numberFormattedStringの呼び出しを続行でき、変換が正しく行われるはずです。ユーザーが小数点以下1桁しか入力できないことを確認する必要があります。

編集:小数点の後に0を入力しても(たとえば100.0)、提案された解決策がまだ機能しないことに気づきましたが、それを解決するために理解できる小さな調整があると確信しています。

于 2012-01-15T07:08:46.703 に答える
0
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {

    NSCharacterSet *numSet = [NSCharacterSet characterSetWithCharactersInString:@"0123456789."];
    NSString *newString = [textField.text stringByReplacingCharactersInRange:range withString:string];
    int charCount = [newString length];

    if ([newString rangeOfCharacterFromSet:[numSet invertedSet]].location != NSNotFound
        || [string rangeOfString:@"."].location != NSNotFound
        || charCount > 15) {
        return NO;
    }

//    if (charCount == 4 || charCount == 9 || charCount==13) {
//         newString = [newString stringByAppendingString:@"."];
//    }
    NSLog(@"IN method");
    textField.text = newString;

    return NO;
}
于 2013-01-19T13:12:46.243 に答える