NSNumberFormatter不允许十进制输入

时间:2012-01-15 01:28:17

标签: objective-c ios uitextfield decimal nsnumberformatter

如果我输入小数点'。'在我的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。

2 个答案:

答案 0 :(得分:1)

假设您输入数字100然后输入小数点。当使用字符串£100.调用numberFormattedString时,它将删除£,而str将包含100.转换为浮点值100的字符串[str floatValue],最后是您的数字formatter将其作为字符串£100吐出,没有任何小数点。所以基本上[str floatValue]会杀死你的小数点。

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

编辑:我刚刚意识到,如果你在小数点后面输入一个0(例如100.0),我建议的解决方案仍然无效,但我确信你可以找到一个小的调整来解决这个问题。

答案 1 :(得分: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;
}