【问题标题】:How to check if NSString is contains a numeric value?如何检查 NSString 是否包含数值?
【发布时间】:2011-10-02 09:47:08
【问题描述】:

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

我一直在环顾四周,但发现很难找到任何符合我想做的事情的东西。我看过 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;
}

希望这会有所帮助。

【问题讨论】:

  • 如果有人感兴趣,我创建了一个要点,其中包含此处在 NSString 类别中提供的一些解决方案 -- NSString+isNumeric

标签: iphone ios nsstring numeric


【解决方案1】:

这样的事情会起作用:

@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 - 位数几乎可以是任意长度。

【讨论】:

  • 我认为这个想法很棒。这对我帮助很大。
  • 在这种方法中,当 string = @"" (为空白字符串)时出现问题。显然不是数字,但返回 YES。
  • @Neru 我猜你可以把它放在一个 if 语句中,首先用string.length检查字符串是否为空?
【解决方案2】:

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

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

编码愉快。


现在,由于上述内容与问题有些相干,请参阅determine if string is numeric。代码取自链接,添加了 cmets:

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——例如没有 scanInt -- 因为浮点数的范围比整数(甚至是 64 位整数)大得多

此函数检查“全数字”,将接受 "42""0.13E2",但拒绝 " 13 ""42foo""helloworld"

【讨论】:

  • 如果我在另一个方法中有一个 NSString 我想传递给这个 bool 方法我该怎么做?我习惯于像这样传递变量 [self methodname:valuetopass];
  • 嗯,很相似...[objWhichHasMethod isNumber: &theNSStringToPass] & 获得指向theNSStringToPass 的“指针”(我假设theNSStringToPass 的类型是NSString)。跨度>
  • @C.Johns 但是,在许多情况下,我希望传递给 already 的变量是 NSString* 类型,而不是这样。 .. 听起来很可疑。
  • 警告:这似乎不适用于带有小数分隔符而不是点的数字。在某些语言中,分隔符是逗号。
  • @mrmuggles:使用 +localizedScannerWithString: 创建扫描仪的本地化实例(或者,在扫描仪实例上调用 -setLocale:)。很好的答案,顺便说一句。
【解决方案3】:

这很简单。

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

【讨论】:

  • 这也适用于负数吗?即:-17.2467
【解决方案4】:

像这样:

- (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");
    }
}

【讨论】:

  • 只是检查,不需要扫描的值,NULL是否足够或必须传入有效地址? (参考表明NULL在这里是可以的。)
  • @WrightsCS NSString 包含文本。文本可能表示一个 NSInteger,但文本本身是“只是数据”。在这种情况下,只需使用不同的scanXYZ 将文本表示读入适当的变量。请注意,scanInt 采用 int*,而不是 NSInteger
  • @pst 是的,但是如果您需要检查 NSInteger,这似乎是多余的;你需要一个新的isNumeric: 方法。
  • 除非您接受整数将扫描为浮点数。即:scanFloat 将适用于整数和浮点数。
【解决方案5】:

在 Swift 中遇到同样的问题。
根据 TomSwift 的回答,您应该在 Swift 中使用此代码:

func isAllDigits(str: String) -> Bool {

    let nonNumbers = NSCharacterSet.decimalDigitCharacterSet()

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

附:您也可以使用其他 NSCharacterSet 或它们的组合来检查您的字符串!

【讨论】:

    【解决方案6】:

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

    整数有一个转换法则:当整数字符串转换为整数(或长)数,然后再次将其转换回另一个字符串时,这些字符串将相等。

    在 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”这样的数字,也没有考虑整数和小数部分的大小。通过使用上述法则,您可以进行所需的任何数字检测。

    【讨论】:

      【解决方案7】:

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

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

      汤姆在这部分上是对的。该步骤为您提供了非数字字符串字符。但是我们这样做:

      NSString *trimmedString = [string stringByTrimmingCharactersInSet:searchSet];
      
      return (string.length == trimmedString.length);
      

      Tom 的反转字符集可以 TRIM 字符串。所以我们可以使用 trim 方法通过比较它们的长度来测试字符串中是否存在任何非数字。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-09
        • 1970-01-01
        • 1970-01-01
        • 2012-01-10
        • 2011-08-14
        • 1970-01-01
        • 2019-08-10
        相关资源
        最近更新 更多