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

C.J*_*hns 30 iphone numeric nsstring ios

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

我一直在看,但我发现很难找到任何符合我想做的事情.我看过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");
    }
}
Run Code Online (Sandbox Code Playgroud)

因此,经过几个小时的搜索,我偶然发现了一个完全符合我要求的实现.

因此,如果您要查看它们是否是您的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;
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助.

Tom*_*ift 53

像这样的东西会起作用:

@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
Run Code Online (Sandbox Code Playgroud)

然后就像这样使用它:

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

BOOL b1 = [hasOtherStuff isAllDigits];
BOOL b2 = [digitsOnly isAllDigits];
Run Code Online (Sandbox Code Playgroud)

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

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


小智 15

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

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

快乐的编码.


现在,由于上面的内容与问题相切,请参阅确定字符串是否为数字.从链接获取的代码,添加了评论:

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;
}
Run Code Online (Sandbox Code Playgroud)

上面的工作只是scanFloat- 例如没有scanInt- 因为float的范围远大于整数的范围(甚至是64位整数).

此功能检查"完全数字",将接受"42""0.13E2",但拒绝" 13 ","42foo""helloworld".


Mat*_*lly 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");
    }
}
Run Code Online (Sandbox Code Playgroud)


art*_*dev 8

这很简单.

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