【问题标题】:Numbers separated by commas in UITextField not workingUITextField 中用逗号分隔的数字不起作用
【发布时间】:2015-04-17 23:55:40
【问题描述】:

我试图在每 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 个字符后插入逗号。我能做些什么来解决它?

【问题讨论】:

  • 您正在以 should* 方法访问 textField.text,即在用户最近的更改更新之前。
  • @bgfriend0 这是正确的,你应该把它写成解决方案的答案。
  • 对不起,写得很快,不得不运行。 ;) 看起来 Luis 已经处理好了。

标签: ios objective-c uitextfield nsnumberformatter


【解决方案1】:

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

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

  • 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;
}

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

【讨论】:

  • 感谢您的扩展回答!有没有办法添加逗号而不是小数?
  • NSNumberFormatterDecimalStyle 确实以这种方式添加逗号:1,234,567,890.00
  • 糟糕。我的错。刚刚试了一下,效果很好!!奇怪的是他们把它叫做decimalStyle,即使它是逗号!
  • 现在每当我输入一个字母时,textField 中的所有数字都会消失
猜你喜欢
  • 2019-01-23
  • 2016-03-27
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2016-04-12
  • 2020-03-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多