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.text
是123
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' 个字符,因此请根据需要扩展验证)。
我正在尝试在每 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.text
是123
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' 个字符,因此请根据需要扩展验证)。