Objective c 防止用户在字符串中输入多个小数

Objective c 防止用户在字符串中输入多个小数,objective-c,Objective C,我正在做一个按钮计算器应用程序(仍然),在这个应用程序中,用户按下一个按钮,我将一个值存储到一个字符串中以显示在文本框中,然后在用户输入=按钮时转换为浮点数 在大多数情况下效果都很好,但我不知道如何防止用户在单个字符串中输入超过一个小数点。我曾考虑将其传递给BOOL方法,但我的课堂材料中根本没有一个涉及方法 我研究了这个堆栈溢出问题,但试图修改自己的代码只会导致一大堆错误。有人有什么建议吗 -(IBAction) decimal { NSString *decVal =

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

在大多数情况下效果都很好,但我不知道如何防止用户在单个字符串中输入超过一个小数点。我曾考虑将其传递给BOOL方法,但我的课堂材料中根本没有一个涉及方法

我研究了这个堆栈溢出问题,但试图修改自己的代码只会导致一大堆错误。有人有什么建议吗

    -(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");
    }

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

例如,您可以这样做:

- (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;
}
这不会抛出错误。它只是不允许第二个周期。不过,您可以轻松地添加错误消息

-(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}。

Facepalm我知道这是一种甜蜜而简单的东西。非常感谢你!