设置UITextField以使用NSNumberFormatter写入最多11个数字

时间:2014-11-14 16:42:36

标签: ios uitextfield nsnumberformatter

我正在尝试将 UITExtField 配置为仅接受11个数字,我正在使用 NSNumberFormatter ,并且使用数字时效果很好,但是当我尝试使用设置可用的最大数量不起作用。

即使分配 setMaximumFractionDigits setMaximumIntegerDigits setMaximumSignificantDigits ,它也不会像它应该的那样工作,或者我错过了什么?请帮忙。

这是我的代码......

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

NSNumberFormatter *num = [[NSNumberFormatter alloc] init];

[num setNumberStyle:NSNumberFormatterDecimalStyle];
[num setUsesSignificantDigits:YES];
[num setMaximumFractionDigits:0];
[num setMaximumIntegerDigits:11];
[num setMaximumSignificantDigits:11];

NSString *aString = [textField.text stringByReplacingCharactersInRange:range withString:string]; 
//[NSString stringWithFormat:@"%@%@", textField.text, string];
NSNumber *number = [num numberFromString:aString];

if (number) {
    return YES;
else
    return NO;
}

修改

我像Ian所说的那样对代码进行了重新排序,并且做了Ink所说的更改,但仍然是相同的,我只能写数字,但我可以写超过11个数字。

编辑2

感谢Ian和Ink,现在它有效,我需要检查 aString.length 是否小于12,它是数字

    if (aString.length < 12 && number)
        return YES;
    else
        return NO;

感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

aString应为[textField.text stringByReplacingCharactersInRange:range withString:string]

return aString.length <= 11;

从那里你可以检查字符串的长度,假设你知道它是一个数字字符串。如果您不能这样做,那么请执行@Ian MacDonald建议并重新排序您的代码,如下所示:

NSNumber *rawNumber = [num numberFromString:aString];

[num setUsesSignificantDigits:YES];
[num setMaximumFractionDigits:0];
[num setMaximumIntegerDigits:11];
[num setMaximumSignificantDigits:11];

NSNumber *number = [num numberFromString:aString];
return rawNumber == number;

另请注意,只看数字格式器给你一个数字是不够好的。您需要检查格式化程序是否修剪了数字。

答案 1 :(得分:0)

您在number上设置约束之前指定了num ...请改为尝试:

[num setUsesSignificantDigits:YES];
[num setMaximumFractionDigits:0];
[num setMaximumIntegerDigits:11];
[num setMaximumSignificantDigits:11];

NSNumber *number = [num numberFromString:aString];

if (number) {
  return [[num stringFromNumber:number] length] <= 11 && [[num stringFromNumber:number] length] == [aString length];
} else {
  return NO;
}