在UITextField中用逗号分隔的数字不起作用

时间:2015-04-17 23:55:41

标签: ios objective-c uitextfield nsnumberformatter

我试图在每3个字符后添加一个小数。 (倒数像这样:1,325,541而不是1325451。)

以下是我的尝试:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
    NSNumberFormatter *numberFormat = [[NSNumberFormatter alloc] init];
    [numberFormat setGroupingSeparator:@","];
    [numberFormat setGroupingSize:3];
    [numberFormat setNumberStyle:NSNumberFormatterDecimalStyle];

    NSNumber *amount = [numberFormat numberFromString:textField.text];
    textField.text = [numberFormat stringFromNumber:amount];
    return YES;
}

每3个字符后不插入逗号。我该怎么做才能解决它?

1 个答案:

答案 0 :(得分:0)

嗯,这最终会比你想象的更微妙,但这就是我想出来的:

在@ bgfriend0的评论提及中,textField:shouldChangeCharactersInRange:replacementString在将修改应用于文本字段之前被调用(这在其他原因下很有用)。这意味着,如果您当前的字符串为123并且用户输入4,则该方法将作为参数传递以下内容:

  • textField: textField,但此时请注意 textField.text123
  • range: NSRange {2,0}
  • string: 4

并且有一种方法可以使该功能在该方法中起作用,但是有更好的方法(我认为)。

实例化textField后,添加目标以侦听编辑事件:

[textField addTarget:self 
              action:@selector(formatNumberIfNeeded:)    
    forControlEvents:UIControlEventEditingChanged];

只要在UITextField中发生编辑更改,就会调用此方法。我们将要执行的SEL将如下所示:

- (void)formatNumberIfNeeded:(UITextField *)textField{
    // you'll need to strip the commas for the formatter to work properly
    NSString * currentTextWithoutCommas = [textField.text stringByReplacingOccurrencesOfString:@"," withString:@""];

    NSNumberFormatter * numberFormatter = [[NSNumberFormatter alloc] init];
    numberFormatter.numberStyle = NSNumberFormatterDecimalStyle;

    NSNumber * numberFromString = [numberFormatter numberFromString:currentTextWithoutCommas];
    NSString * formattedNumberString = [numberFormatter stringFromNumber:numberFromString];

    textField.text = formattedNumberString;
}

现在,如果您需要本地化,事情会变得更加棘手,但如果需要,可以越过那个桥梁。

至于textField:shouldChangeCharactersInRange:replacementString,这是进行角色验证的更好地方。因此,检查字母的基本验证可能如下所示:

-(BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string{

    NSRange illegalCharacterEntered = [string rangeOfCharacterFromSet:[NSCharacterSet letterCharacterSet]];
    if ( illegalCharacterEntered.location != NSNotFound ) {
        return NO;
    }

    return YES;
}

因此,使用这两位代码,您将能够更新文本字符串以包含每个第3个字符的逗号,并且用户将无法输入任何字母表的字母(但他们仍然可以输入其他字母) '非法'字符,因此请根据需要扩展验证。