2014-11-14 32 views
0

我想要一个的UITextField配置为仅接受11号11号写的,我使用NSNumberFormatter和它的作品只是用数字很好,但是当我尝试设置可用的最大数量,它不起作用。设置为UITextField到最大使用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; 
} 

编辑:

我重新排序像伊恩代码表示,并提出,油墨也称,这些变化还是一样,我可以只写数字,但我可以写出超过11个数字。

EDIT 2

感谢Ian和墨水,现在的作品,我需要检查aString.length是轻微高于12,它是一个

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

感谢您的帮助!

+0

提供一些什么,如果不工作的例子。 – rmaddy 2014-11-14 16:57:16

+0

我真的建议不要这样做。基于过滤类型拒绝用户内容更改非常令人沮丧。当用户输入文本时,文本可以经历许多中间阶段,通过验证他们进入你需要他们遵循对他们来说可能不明显的路径。 – 2014-11-14 17:59:10

回答

0

您在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; 
} 
+0

我试过了,我仍然可以写出超过11个数字。 – xzrudy 2014-11-14 17:28:43

+0

那是因为你没有检查事物的长度,你只是使用它的结果。它仍然会解析一个数字,它只是不一定符合您的输入。如果你担心结果,你应该比较'aString。长度<= 11“或使用您的数字格式化程序进行反向并检查长度... – 2014-11-14 17:53:10

+0

什么是愚蠢的我,我只是评估数字本身,我需要检查如果aString的长度<12。 !,感谢队友帮助我意识到这一点! – xzrudy 2014-11-14 18:04:16

1

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

return aString.length <= 11; 

从那里,你可以只检查字符串的长度,假设你知道,这是一个数字字符串。如果你不能假设,然后做什么@Ian麦克唐纳建议,并重新安排你的代码看起来像这样:

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; 

还要注意,只是看到,如果数字格式给你一个数字是不够好。你需要检查数字是否被格式化程序修剪过。

+0

虽然这是事实,但这不是问题的答案。请将其作为评论或更新您的答案以真正回答问题。 – rmaddy 2014-11-14 16:56:50

+0

我做了你告诉我,我仍然得到相同的结果;我可以写出超过11个数字。 – xzrudy 2014-11-14 17:19:09

+0

@xzrudy更多详细信息 – InkGolem 2014-11-14 17:29:13