如何检查NSString是否包含数值?

时间:2011-07-10 21:58:23

标签: iphone ios nsstring numeric

我有一个从公式生成的字符串,但是我只想使用该字符串,只要它的所有字符都是数字,如果不是我想做不同的事情,例如显示错误信息。< / p>

我一直在看,但我发现很难找到任何符合我想做的事情。我看过NSScanner,但我不确定它是否检查整个字符串然后我不确定如何检查这些字符是否为数字

- (void)isNumeric:(NSString *)code{

    NSScanner *ns = [NSScanner scannerWithString:code];
    if ( [ns scanFloat:NULL] ) //what can I use instead of NULL?
    {
        NSLog(@"INSIDE IF");
    }
    else {
    NSLog(@"OUTSIDE IF");
    }
}

所以经过几个小时的搜索后,我偶然发现了一个完全符合我要求的实现。

所以如果你想检查你的NSString中是否有任何字母数字字符,这可以在这里工作

-(bool) isNumeric:(NSString*) hexText
{

    NSNumberFormatter* numberFormatter = [[[NSNumberFormatter alloc] init] autorelease];

    NSNumber* number = [numberFormatter numberFromString:hexText];

    if (number != nil) {
        NSLog(@"%@ is numeric", hexText);
        //do some stuff here      
        return true;
    }

    NSLog(@"%@ is not numeric", hexText);
    //or do some more stuff here
    return false;
}
希望这会有所帮助。

7 个答案:

答案 0 :(得分:51)

这样的事情会起作用:

@interface NSString (usefull_stuff)
- (BOOL) isAllDigits;
@end

@implementation NSString (usefull_stuff)

- (BOOL) isAllDigits
{
    NSCharacterSet* nonNumbers = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
    NSRange r = [self rangeOfCharacterFromSet: nonNumbers];
    return r.location == NSNotFound && self.length > 0;
}

@end

然后就这样使用它:

NSString* hasOtherStuff = @"234 other stuff";
NSString* digitsOnly = @"123345999996665003030303030";

BOOL b1 = [hasOtherStuff isAllDigits];
BOOL b2 = [digitsOnly isAllDigits];

您不必将此功能包装在这样的私有类别扩展中,但它确实可以轻松重用..

我比其他人更喜欢这个解决方案,因为它不会溢出一些通过NSScanner扫描的int / float - 数字的位数几乎可以是任何长度。

答案 1 :(得分:15)

考虑NSString integerValue - 它会返回NSInteger。但是,它将接受一些不完全是数字的字符串,并且不提供确定根本不是数字的字符串的机制。这可能是也可能是不可接受的。

例如," 13 " -> 13"42foo" -> 42"helloworld" -> 0

快乐的编码。


现在,由于上述内容与问题相切,请参阅determine if string is numeric。从链接获取的代码,添加了评论:

BOOL isNumeric(NSString *s)
{
   NSScanner *sc = [NSScanner scannerWithString: s];
   // We can pass NULL because we don't actually need the value to test
   // for if the string is numeric. This is allowable.
   if ( [sc scanFloat:NULL] )
   {
      // Ensure nothing left in scanner so that "42foo" is not accepted.
      // ("42" would be consumed by scanFloat above leaving "foo".)
      return [sc isAtEnd];
   }
   // Couldn't even scan a float :(
   return NO;
}

以上只适用于scanFloat - 例如no scanInt - 因为float的范围比整数(甚至是64位整数)大得多

此功能会检查“完全数字”并接受"42""0.13E2"但拒绝" 13 ""42foo""helloworld"

答案 2 :(得分:8)

像这样:

- (void)isNumeric:(NSString *)code{

    NSScanner *ns = [NSScanner scannerWithString:code];
    float the_value;
    if ( [ns scanFloat:&the_value] )
    {
        NSLog(@"INSIDE IF");
        // do something with `the_value` if you like
    }
    else {
    NSLog(@"OUTSIDE IF");
    }
}

答案 3 :(得分:7)

非常简单。

+ (BOOL)isStringNumeric:(NSString *)text
{
    NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
    NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:text];        
    return [alphaNums isSupersetOfSet:inStringSet];
}

答案 4 :(得分:2)

在Swift面临同样的问题。
根据TomSwift的回答,在Swift中你应该使用这段代码:

func isAllDigits(str: String) -> Bool {

    let nonNumbers = NSCharacterSet.decimalDigitCharacterSet()

    if let range = str.rangeOfCharacterFromSet(nonNumbers) {
        return true
    }
    else {
        return false
    }
}

P.S。您也可以使用其他NSCharacterSet或它们的组合来检查您的字符串!

答案 5 :(得分:0)

对于像“12234”或“231231.23123”这样的简单数字,答案很简单。

对于int数字有一个转换规律:当带有整数的字符串转换为int(或long)数字时,再次将它转换回另一个字符串,这些字符串将是相等的。

在Objective C中,它将如下所示:

NSString *numStr=@"1234",*num2Str=nil;
num2Str=[NSString stringWithFormat:@"%lld",numStr.longlongValue];

if([numStr isEqualToString: num2Str]) NSLog(@"numStr is an integer number!");

通过使用这种转换法,我们可以创建解决方案 检测doublelong个数字:

NSString *numStr=@"12134.343"
NSArray *numList=[numStr componentsSeparatedByString:@"."];

if([[NSString stringWithFormat:@"%lld", numStr.longLongValue] isEqualToString:numStr]) NSLog(@"numStr is an integer number"); 
else 
if( numList.count==2 &&
               [[NSString stringWithFormat:@"%lld",((NSString*)numList[0]).longLongValue] isEqualToString:(NSString*)numList[0]] &&
               [[NSString stringWithFormat:@"%lld",((NSString*)numList[1]).longLongValue] isEqualToString:(NSString*)numList[1]] )
            NSLog(@"numStr is a double number");
else 
NSLog(@"numStr is not a number");

我没有从我的工作代码中复制上面的代码,所以可能会出现一些错误,但我认为重点很明确。 当然,这个解决方案不适用于像“1E100”这样的数字,并且它不考虑整数和小数部分的大小。通过使用上述法律,您可以进行任何需要的检测。

答案 6 :(得分:0)

C.Johns&#39;答案是错的。如果你使用格式化程序,你可能会冒苹果在某些时候改变他们的代码库,并让格式化程序吐出部分结果。汤姆的回答也是错的。如果使用rangeOfCharacterFromSet方法并检查NSNotFound,如果字符串包含一个数字,则它将注册为true。同样,此线程中的其他答案建议使用Integer值方法。这也是错误的,因为如果字符串中存在一个整数,它将注册为true。 OP要求答案确保整个字符串是数字。试试这个:

NSCharacterSet *searchSet = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];

汤姆对这一部分说得对。该步骤为您提供非数字字符串字符。但是我们这样做:

NSString *trimmedString = [string stringByTrimmingCharactersInSet:searchSet];

return (string.length == trimmedString.length);

汤姆的倒置字符集可以TRIM一个字符串。因此,我们可以使用trim方法来测试字符串中是否存在任何非数字,方法是比较它们的长度。