0

我正在为我的足球俱乐部制作一个应用程序,以便彼此进行小赌注。我正在尝试找到一种从用户那里接收价格输入的方法。我需要这个数字的形式N(X).XX在小数点前有多少 X 并不重要。我已经考虑了几个选项,但我只是没有足够的经验来决定哪个是最好的。

到目前为止我的想法是:

  1. 创建一个显示数字键盘的文本字段。然后我可以使用[numberFormatter numberFromString: text];. 然而,这似乎有点太冒险了。例如,如果用户要输入XX.XXXX.XX.X或类似的东西,那么应用程序会接受这些值,从而导致稍后出现问题。

  2. 我的另一个想法是使用某种选择器,但是我们将被限制在一组固定的值上。

你有什么建议吗?我可能会使用文本字段对正确的格式输入进行某种检查,但我不完全确定我将如何去做。

编辑:刚刚检查了 eBay 应用程序,他们有一个非常好的方法。他们使用限制为小数点后两位数的文本字段。我到底要怎么编程呢?

4

2 回答 2

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 以查看小数点后有多少位并阻止输入更多

于 2012-11-29T14:27:17.720 回答
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);
}

请注意,这假定您正在使用 a UIKeyboardTypeNumbersAndPunctuation,而不是在UITextFieldDelegate方法中对其进行测试。

于 2012-11-29T14:43:58.510 回答