如何检查NSString是否包含数值?
我有一个正在从公式生成的string,但是我只想使用string,只要它的所有字符是数字,如果不是,我想要做不同的事情,例如显示一个错误信息。
我一直在看,但是我发现很难find任何符合我想做的事情的东西。 我看了NSScanner,但我不知道是否它检查整个string,然后我真的不知道如何检查这些字符是数字
- (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"); } }
所以在经过几个小时的search后,我发现了一个实际上正在寻找的东西。
所以如果你正在寻找检查他们是否是你的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; }
希望这可以帮助。
像这样的东西可以工作:
@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];
您不必将function封装在这样的私有类别扩展中,但确实可以轻松地重复使用。
我喜欢这个解决scheme比别人更好,因为它不会溢出一些通过NSScanner扫描的int / float – 数字的数量可以几乎任何长度。
考虑NSString integerValue
– 它返回一个NSInteger
。 但是,它将接受一些不完全是数字的string,并且不提供一种机制来确定根本不是数字的string。 这可能会也可能不会被接受。
例如, " 13 " -> 13
, "42foo" -> 42
和"helloworld" -> 0
。
快乐的编码。
现在,由于上面是问题的切线,请参阅确定string是否为数字 。 取自链接的代码,添加注释:
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位整数)的范围。
此function检查“完全数字”,将接受"42"
和"0.13E2"
但拒绝" 13 "
, "42foo"
和"helloworld"
。
喜欢这个:
- (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"); } }
这很简单。
+ (BOOL)isStringNumeric:(NSString *)text { NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet]; NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:text]; return [alphaNums isSupersetOfSet:inStringSet]; }
在Swift中面临同样的问题。
在Swift中,你应该使用这个代码,根据TomSwift的回答:
func isAllDigits(str: String) -> Bool { let nonNumbers = NSCharacterSet.decimalDigitCharacterSet() if let range = str.rangeOfCharacterFromSet(nonNumbers) { return true } else { return false } }
PS也可以使用其他NSCharacterSets或他们的组合来检查你的string!
对于简单的数字,如“12234”或“231231.23123”,答案可以很简单。
int数字有一个转换规则:当整数string转换为int(或long)数字,然后再转换回另一个string时,这些string将相等。
在Objective C中,它将如下所示:
NSString *numStr=@"1234",*num2Str=nil; num2Str=[NSString stringWithFormat:@"%lld",numStr.longlongValue]; if([numStr isEqualToString: num2Str]) NSLog(@"numStr is an integer number!");
通过使用这个转换法则我们可以创造出解
检测double
或long
号码:
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");
我没有复制我的工作代码上面的代码,所以可能会有一些错误,但我认为重点是明确的。 当然,这个解决scheme不适用于像“1E100”这样的数字,也不考虑整数和小数部分的大小。 通过使用上述的法律,你可以做任何你需要的数字检测。
- UIAccessibilityLayoutChangedNotification和UIAccessibilityScreenChangedNotification之间的实际区别?
- iOS上的Python或Ruby解释器