2

我正在做臭名昭著的斯坦福计算器作业。我需要验证输入的数字是否为有效浮点值,这样我们就可以处理像 102.3.79 这样的数字。

为了避免编写一个小循环来计算字符串中的句点,必须有一个内置函数是吗?

4

4 回答 4

8

您可以使用 C 标准库函数strtod()。它在遇到错误的地方停止,并相应地设置其输出参数。你可以利用这个事实如下:

- (BOOL)isValidFloatString:(NSString *)str
{
    const char *s = str.UTF8String;
    char *end;
    strtod(s, &end);
    return !end[0];
}
于 2013-02-10T21:45:05.887 回答
2
-(BOOL) isNumeric:(NSString*)string {    
    NSNumberFormatter *formatter = [NSNumberFormatter new];
    [formatter setNumberStyle:NSNumberFormatterDecimalStyle];
    NSNumber *number = [formatter numberFromString:string];
    [formatter release]; // if using ARC remove this line
    return number!=nil;
}

-(BOOL) isFloat:(NSString*)string {
    NSScanner *scanner = [NSScanner scannerWithString:string];
    [scanner scanFloat:NULL];
    return [scanner isAtEnd];
}
于 2013-02-10T22:32:19.743 回答
2

经历了 CS193P 之后,我认为这个想法是为了适应NSStringUILabel使用 C。我会考虑有一个简单的小数点BOOL标志,因为按下按钮并且你正在连接数字 1- 用于使用和 2- 用于显示。

当您进行其他检查(例如在数字末尾悬挂小数点或允许用户退格数字)时,这也会派上用场。

编辑例如:

创建一个连接到每个数字按钮的 IBAction:

- (IBAction)numberButtonPressed:(UIButton *)sender 
{  
  if([sender.titleLabel.text isEqualToString:@"."])
  {
    if (!self.inTheMiddleOfEnteringANumber)
        self.display.text=[NSString stringWithString:@"0."];

    else if (!self.decimalPointEntered)
      {
        self.display.text=[self.display.text stringByAppendingString:sender.titleLabel.text]; 
        self.decimalPointEntered=TRUE;
      }
   }   
self.inTheMiddleOfEnteringANumber=TRUE;
}
于 2013-02-10T22:04:51.353 回答
2

@"."在字符串中计数至少有一个相当优雅的解决方案:

NSString *input = @"102.3.79";
if([[input componentsSeparatedByString:@"."] count] > 2) {
    NSLog(@"input has too many points!");
}

再深入一点...如果您希望将整个字符串验证为数字,请尝试配置NSNumberFormatter并调用numberFromString:NSNumberFormatter 文档)。

于 2013-02-10T22:20:03.893 回答