阻止用户在字符串中输入多个小数

时间:2014-03-14 02:27:09

标签: objective-c

我正在做一个按钮计算器应用程序(静止),用户按下按钮,我将一个值存储到一个字符串中以显示在文本框中,然后在用户输入=按钮时转换为浮点数。

大部分工作都很好,除了我无法弄清楚如何阻止用户在单个字符串中输入多个小数。我想过将它传递给BOOL方法,但我的课程材料都没有涵盖任何方法。

我查看了这个Stack溢出问题,但是尝试修改我自己的代码只会导致一大堆错误。有没有人有任何建议?

    -(IBAction) decimal
    {
     NSString *decVal =@".";
     NSRange range = [decVal rangeOfString:@"."];

     if (range.location==NSNotFound)
      {
        display.text = [display.text stringByAppendingString:decVal];
      }
    else
    {
        NSLog(@"You can't enter more than one decimal");
    }

}

2 个答案:

答案 0 :(得分:1)

-(IBAction) decimal
{
    static NSString *decVal =@".";
    NSRange range = [display.text rangeOfString:decVal];

    if (NSNotFound == range.location)
    {
        display.text = [display.text stringByAppendingString:decVal];
    }
    else
    {
        NSLog(@"You can't enter more than one decimal");
    }
}

你错过了一个字符串。 [decVal rangeOfString:@"."]将始终返回范围{0,1}。

答案 1 :(得分:0)

处理此问题的一种方法是设置文本字段/视图的委托,然后在委托中实现shouldChangeCharactersInRange

例如,您可以执行以下操作:

- (BOOL)textField:(UITextField *)textField shouldChangeCharactersInRange:(NSRange)range replacementString:(NSString *)string {
    BOOL hasPeriod = ([textField.text rangeOfString:@"."].location != NSNotFound);
    BOOL removingPeriod = ([[textField.text substringWithRange:range] 
                                 rangeOfString:@"."].location != NSNotFound);
    BOOL addingPeriod = ([string rangeOfString:@"."].location != NSNotFound);
    return (hasPeriod && addingPeriod && !removingPeriod) ? NO : YES;
}

这不会引发错误。它只是赢得了第二个时期。不过,您可以轻松添加错误消息。