【问题标题】:How to check if NSString is numeric or not [duplicate]如何检查 NSString 是否为数字 [重复]
【发布时间】:2011-01-02 11:37:24
【问题描述】:

可能重复:
iphone how to check that a string is numeric only

我有一个 NSString,然后我想检查字符串是否为数字。

我是说

NSString *val = @"5555" ;

if(val isNumber ){
  return true;
}else{
  retun false;
}

如何在 Objective C 中做到这一点?

【问题讨论】:

  • 什么算作数字?整数?浮点?科学计数法?以“0x”开头的十六进制?带有前导“0b”的二进制文件?

标签: objective-c nsstring


【解决方案1】:

你可以使用rangeOfCharacterFromSet::

@interface NSString (isNumber)
-(BOOL)isInteger;
@end

@interface _IsNumber
+(void)initialize;
+(void)ensureInitialization;
@end

@implementation NSString (isNumber)
static NSCharacterSet* nonDigits;
-(BOOL)isInteger {
    /* bit of a hack to ensure nonDigits is initialized. Could also 
       make nonDigits a _IsNumber class variable, rather than an 
       NSString class variable.
     */
    [_IsNumber ensureInitialization];
    NSRange nond = [self rangeOfCharacterFromSet:nonDigits];
    if (NSNotFound == nond.location) {
        return YES;
    } else {
        return NO;
    }
}
@end

@implementation _IsNumber
+(void)initialize {
    NSLog(@"_IsNumber +initialize\n");
    nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
}
+(void)ensureInitialization {}
@end

【讨论】:

  • 这不是有点矫枉过正吗?使用 NSScanner 或(不太可靠)仅在字符串上调用 floatValueintValue 有什么问题?但是,即使对于包含数千位数字的数字,您的方法也会返回 YES,这可能更有用。此外,您的字符集将被自动释放(如果它没有被运行时缓存)。
  • @dreamlax: NSScanner*Value 方法都将接受以数字开头但之后有其他字符的字符串。根据 OP 的实际目的,这种行为可能会更好,也可能是不可接受的。 NSNumberFormatter 可能是最好的解决方案,因为它适用于浮点并考虑到本地化。
  • 这与语言环境无关。
  • 如果您有一个非常长的数字串(例如 34 位跟踪号),这也很有用。
【解决方案2】:

使用[NSNumberFormatter numberFromString: s]。如果指定的字符串不是数字,则返回 nil。您可以配置 NSNumberFormatter 来为您的特定场景定义“数字”。


#import <Foundation/Foundation.h>

int
main(int argc, char* argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
    NSLocale *l_en = [[NSLocale alloc] initWithLocaleIdentifier: @"en_US"];
    NSLocale *l_de = [[NSLocale alloc] initWithLocaleIdentifier: @"de_DE"];
    NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
    [f setLocale: l_en];

    NSLog(@"returned: %@", [f numberFromString: @"1.234"]);

    [f setAllowsFloats: NO];
    NSLog(@"returned: %@", [f numberFromString: @"1.234"]);

    [f setAllowsFloats: YES];
    NSLog(@"returned: %@", [f numberFromString: @"1,234"]);

    [f setLocale: l_de];
    NSLog(@"returned: %@", [f numberFromString: @"1,234"]);

    [l_en release];
    [l_de release];
    [f release];
    [pool release];
}

【讨论】:

  • 我比骗子更喜欢这个答案。几乎可以肯定,使用 Foundation 比使用 RegEx 更可取。
  • numberFromString 是一个实例方法,不是类方法,只是为了澄清一下。
猜你喜欢
  • 1970-01-01
  • 2012-08-27
  • 2011-11-27
  • 2016-03-07
  • 2011-10-02
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
  • 2021-04-22
相关资源
最近更新 更多