【问题标题】:Set a UITextField to write a maximum of 11 numbers using NSNumberFormatter使用 NSNumberFormatter 设置 UITextField 以写入最多 11 个数字
【发布时间】:2014-11-14 16:42:35
【问题描述】:

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

即使分配 setMaximumFractionDigitssetMaximumIntegerDigitssetMaximumSignificantDigits 也无法正常工作,还是我遗漏了什么?请帮忙。

这是我的代码……

-(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;

感谢您的帮助!

【问题讨论】:

  • 如果什么不起作用,请提供一些示例。
  • 我真的不建议这样做。在用户输入时根据过滤拒绝用户内容更改是非常令人沮丧的。当用户输入文本时,文本可能会经历多个中间阶段,并且通过在他们输入时进行验证,您要求他们遵循对他们来说可能并不明显的路径。

标签: ios uitextfield nsnumberformatter


【解决方案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;

还请注意,仅查看数字格式化程序是否为您提供了数字还不够好。您需要检查数字是否被格式化程序修剪。

【讨论】:

  • 虽然正确,但这并不是问题的答案。将此作为评论或更新您的答案以实际回答问题。
  • 我按照你说的做了,结果还是一样;我可以写超过 11 个数字。
  • @xzrudy 添加了更多详细信息
【解决方案2】:

在对num 设置约束之前,您要分配number...试试这个:

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

【讨论】:

  • 我试过了,我仍然可以写超过 11 个数字。
  • 那是因为你没有检查事物的长度,你只是在使用它的结果。它仍然会解析一个数字,只是不一定与您的输入相匹配。如果您担心结果,您应该比较 aString.length &lt;= 11 或使用您的数字格式化程序反向检查长度...
  • 我真是个笨蛋,我只是在评估数字本身,我需要检查 aString 的长度是否小于 12。现在它可以工作了!感谢队友帮助我实现这一点!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-01
  • 1970-01-01
  • 2010-09-30
  • 1970-01-01
相关资源
最近更新 更多