我正在做臭名昭著的斯坦福计算器作业。我需要验证输入的数字是否为有效浮点值,这样我们就可以处理像 102.3.79 这样的数字。
为了避免编写一个小循环来计算字符串中的句点,必须有一个内置函数是吗?
我正在做臭名昭著的斯坦福计算器作业。我需要验证输入的数字是否为有效浮点值,这样我们就可以处理像 102.3.79 这样的数字。
为了避免编写一个小循环来计算字符串中的句点,必须有一个内置函数是吗?
您可以使用 C 标准库函数strtod()
。它在遇到错误的地方停止,并相应地设置其输出参数。你可以利用这个事实如下:
- (BOOL)isValidFloatString:(NSString *)str
{
const char *s = str.UTF8String;
char *end;
strtod(s, &end);
return !end[0];
}
-(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];
}
经历了 CS193P 之后,我认为这个想法是为了适应NSString
和UILabel
使用 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;
}
@"."
在字符串中计数至少有一个相当优雅的解决方案:
NSString *input = @"102.3.79";
if([[input componentsSeparatedByString:@"."] count] > 2) {
NSLog(@"input has too many points!");
}
再深入一点...如果您希望将整个字符串验证为数字,请尝试配置NSNumberFormatter
并调用numberFromString:
(NSNumberFormatter 文档)。