我试图在每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个字符后不插入逗号。我该怎么做才能解决它?
答案 0 :(得分:0)
嗯,这最终会比你想象的更微妙,但这就是我想出来的:
在@ 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个字符的逗号,并且用户将无法输入任何字母表的字母(但他们仍然可以输入其他字母) '非法'字符,因此请根据需要扩展验证。