如何在Objective-C中判断输入是数字还是文本?

5

我试着搜索过,但是我觉得我的谷歌搜索技巧不够好,因此我向人们寻求帮助。我正在扫描一个字符串并取出其中的每个元素。我需要找出它是数字还是文本。我是这样进行检查的:

// Try to convert to double
@try{
double whatever=[myString doubleValue];

// If text is stored in myString, then it should throw an exception
} @catch (NSException *e){

// Do whatever I need, but here I know that it's text, not a number


}

然而,我发现Objective-C不会抛出异常,它只会返回0。我不能依赖于用户不使用零作为输入的事实,我该怎么办?
提前感谢您,我相信有类似的讨论,我只是没有找到...

我认为NSScanner是最好的方法来实现这一点。请参见@VinceBurn的答案。 - nielsbot
2
不需要try/catch,因为调用NSString doubleValue不会抛出异常。这不是Java。 - rmaddy
5个回答

2

将字符串转换为双精度浮点数,再转回字符串。如果与原始字符串匹配,则为双精度浮点数。 注意前导和尾随空格。


哇,我怎么没想到呢...非常感谢! - Alexander Troshchenko
我发现初始值可以是21,但是双精度浮点数的值将会是21.000000... 例如... 不过这是个好主意,我会进行一些简单的检查并找出答案。 - Alexander Troshchenko
1
这是一个不好的想法。浮点数并不精确,而字符串是精确的。 - Terry Wilcox

2

试试这个:

NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];

NSNumber *number = [formatter numberFromString:myString];

if (number) {
  // it's a number
} else {
  // it's not a number
}

1

您可以使用类NSScanner来查找是否使用此方法获得了有效的double

- (BOOL)scanDouble:(double *)doubleValue

一旦您使用字符串初始化了扫描仪。


为什么要用 (double *) ?因为你想让这个方法返回给你两个信息,doubleValue它是否是有效的 double 值。后者由 BOOL 给出,而只有指针才能从方法调用中获取前者的值(除了返回值)。

参数
doubleValue
返回时包含已扫描的值。在溢出时包含 HUGE_VAL 或 -HUGE_VAL,在下溢时包含 0.0。
返回值
如果接收器找到有效的浮点表示,则为 YES,否则为 NO。


1
谢谢,但为什么指向双精度浮点数而不是双精度浮点数本身?据我所知,双精度浮点数是一种原始类型... - Alexander Troshchenko
因为您想要该方法返回给您两个信息,即 doubleValue 和它是否是有效的 double。后者由 BOOL 给出,而仅有指针才能从方法调用中获取值。 - Vincent Bernier

0
NSMutableString *stringElement = [NSMutableString stringWithCapacity:[yourString length]];
for (int i=0; i<[yourString length]; i++) {
    if (isdigit([stringElement characterAtIndex:i])) {
      //is digit
    }
}

0

例子:

NSError* error;
NSString* string=@"10";
NSNumberFormatter* formatter=[NSNumberFormatter new];
formatter.numberStyle= NSNumberFormatterDecimalStyle; // set whatever style you need
NSNumber* number;
if([formatter getObjectValue: &number forString: string errorDescription: &error])
{
    // You got the number
    NSLog(@"%@",number);
}
else
{
    // haven't got the number, the string is invalid
    NSLog(@"%@",error);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接