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,然后输入小数点。当使用 string 调用 numberFormattedString 时£100.,它将摆脱 £,而 str 将包含转换为浮点值 100 的字符串100.[str floatValue]最后您的数字格式化程序将其作为£100不带任何小数点的字符串吐回。所以基本上[str floatValue]是在杀死你的小数点。

一种解决方案是检查您何时在文本字段委托方法中将小数点作为替换字符串,并在这种情况下跳过调用 numberFormattedString。然后当用户输入下一个数字时,您可以继续调用 numberFormattedString,并且转换应该正确发生。您只需确保用户只能输入一位小数。

编辑:我刚刚意识到,如果您在小数点后输入 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 回答