Как проверить, содержит ли NSString числовое значение?
У меня есть строка, которая генерируется из формулы, однако я хочу использовать только эту строку, если все ее символы являются числовыми, если не то, что я хочу сделать что-то другое, например, вывести сообщение об ошибке.
Я смотрю вокруг, но мне трудно найти что-нибудь, что работает в соответствии с тем, что я хочу делать. Я посмотрел на 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;
}
надеюсь, что это поможет.
Ответы
Ответ 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];
Вам не нужно включать функциональные возможности в расширение частной категории, но это, безусловно, упрощает повторное использование.
Мне нравится это решение лучше, чем другие, поскольку он никогда не переполняет какой-либо int/float, который сканируется через NSScanner - количество цифр может быть практически любой длины.
Ответ 2
Рассмотрим 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;
}
Вышеуказанное работает только с scanFloat
- например. no scanInt
- потому что диапазон поплавка намного больше, чем целочисленный (даже 64-битное целое число).
Эта функция проверяет "полностью числовые" и принимает "42"
и "0.13E2"
, но отклоняет " 13 "
, "42foo"
и "helloworld"
.
Ответ 3
Вот так:
- (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");
}
}
Ответ 4
Это очень просто.
+ (BOOL)isStringNumeric:(NSString *)text
{
NSCharacterSet *alphaNums = [NSCharacterSet decimalDigitCharacterSet];
NSCharacterSet *inStringSet = [NSCharacterSet characterSetWithCharactersInString:text];
return [alphaNums isSupersetOfSet:inStringSet];
}
Ответ 5
Столкнулась с той же проблемой в Swift.
В Swift вы должны использовать этот код, в соответствии с ответом TomSwift:
func isAllDigits(str: String) -> Bool {
let nonNumbers = NSCharacterSet.decimalDigitCharacterSet()
if let range = str.rangeOfCharacterFromSet(nonNumbers) {
return true
}
else {
return false
}
}
P.S. Также вы можете использовать другие NSCharacterSets или их комбинации, чтобы проверить вашу строку!
Ответ 6
Для простых чисел, таких как "12234" или "231231.23123", ответ может быть простым.
Существует закон преобразования для чисел int: когда строка с целым числом преобразуется в число int (или long), а затем снова преобразует ее обратно в другую строку, эти строки будут равны.
В Objective C он будет выглядеть так:
NSString *[email protected]"1234",*num2Str=nil;
num2Str=[NSString stringWithFormat:@"%lld",numStr.longlongValue];
if([numStr isEqualToString: num2Str]) NSLog(@"numStr is an integer number!");
Используя этот закон преобразования, мы можем создать решение
для обнаружения чисел double
или long
:
NSString *[email protected]"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", а также не учитывает размер целой и дробной части. Используя закон, описанный выше, вы можете делать все, что вам нужно.