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

Numbers separated by commas in UITextField not working

我正在尝试在每 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 个字符后插入一个逗号。我该如何解决?

好吧,这最终比你想象的要微妙一些,但这就是我想出的:

正如@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 个字符包含一个逗号,并且用户将无法输入字母表中的任何字母(但他们仍然可以输入其他字母) 'illegal' 个字符,因此请根据需要扩展验证)。