我正在为我的足球俱乐部制作一个应用程序,让他们互相打赌。我正试图找到一种方法来接收用户的价格输入。我需要的数字是N(X).XX
形式,其中小数点之前有多少X无关紧要。我考虑了几个选项,但我没有足够的经验来决定哪个是最好的。
到目前为止我的想法:
创建一个显示数字键盘的文本字段。然后我可以使用[numberFormatter numberFromString: text];
。然而,这似乎有点冒险。例如,如果用户要输入XX.XXX
或X.XX.X
或类似内容,那么该应用会接受这些值,从而导致以后出现问题。
我的另一个想法是使用某种选择器,但我们将限制在一组固定的值。
你推荐什么?我可能会使用文本字段来检查正确的格式输入,但我不完全确定我是如何做到的。
编辑:刚刚查看了易趣应用,他们有一个非常好的方式。它们使用的文本字段限制为小数点后的两位数。我怎么编程呢?
答案 0 :(得分:2)
数字键盘没有“。”。 在类似的情况下,我使用了数字和标点符号键盘,并且必须实现UITextFieldDelegate方法
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
我阻止了任何非数字字符或“。”
我的代码如下。这个想法来自于stackoverflow的另一个答案,但我现在无法找到它,所以不管是谁提供了这个。
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string length] == 0)
return YES;
if ([textField keyboardType]==UIKeyboardTypeNumbersAndPunctuation)
{
NSMutableCharacterSet *_alnum = [NSMutableCharacterSet characterSetWithCharactersInString:@"."];
NSCharacterSet *numberSet = [NSCharacterSet decimalDigitCharacterSet];
[_alnum formUnionWithCharacterSet:numberSet];
NSCharacterSet *nonNumberSet = [_alnum invertedSet];
return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
}else{
return YES;
}
}
在同样的方法中,你可以用类似的方法检查textField.text,看看小数点后面有多少位数,再阻止输入
答案 1 :(得分:1)
要建立@ SteveC的正确答案,需要进行一些额外的检查以限制小数点后的位数;但是小数点的数量(正如你在原始问题中提到的那样。):
- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string
{
if ([string length] == 0)
return YES;
NSInteger firstDecimalLocation = [[textField text] rangeOfString:@"."].location;
if( firstDecimalLocation != NSNotFound ) {
if( [string isEqualToString:@"."] ) {
return NO;
}
if( firstDecimalLocation == range.location - 3 ) {
return NO;
}
}
NSMutableCharacterSet *_alnum = [NSMutableCharacterSet characterSetWithCharactersInString:@"."];
NSCharacterSet *numberSet = [NSCharacterSet decimalDigitCharacterSet];
[_alnum formUnionWithCharacterSet:numberSet];
NSCharacterSet *nonNumberSet = [_alnum invertedSet];
return ([string stringByTrimmingCharactersInSet:nonNumberSet].length > 0);
}
请注意,这假设您使用的是UIKeyboardTypeNumbersAndPunctuation
,而不是在UITextFieldDelegate
方法中对其进行测试。