14 ответов:
вот один из способов, который не зависит от ограниченной точности попытки разобрать строку как число:
NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; if ([newString rangeOfCharacterFromSet:notDigits].location == NSNotFound) { // newString consists only of the digits 0 through 9 }посмотреть
+[NSCharacterSet decimalDigitCharacterSet]и-[NSString rangeOfCharacterFromSet:].
Я бы предложил использовать
numberFromString:метод NSNumberFormatter класс, как будто число не является допустимым, он вернет nil; в противном случае, он вернет вам NSNumber.NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease]; BOOL isDecimal = [nf numberFromString:newString] != nil;
вы можете создать NSScanner и просто сканировать строку:
NSDecimal decimalValue; NSScanner *sc = [NSScanner scannerWithString:newString]; [sc scanDecimal:&decimalValue]; BOOL isDecimal = [sc isAtEnd];проверить документация NSScanner для большего количества методов на выбор.
Я думаю, самый простой способ проверить, что каждый символ в данной строке числовой, вероятно:
NSString *trimmedString = [newString stringByTrimmingCharactersInSet:[NSCharacterSet decimalDigitCharacterSet]]; if([trimmedString length]) { NSLog(@"some characters outside of the decimal character set found"); } else { NSLog(@"all characters were in the decimal character set"); }используйте один из других методов фабрики NSCharacterSet, если вы хотите получить полный контроль над допустимыми символами.
проверка по регулярному выражению, по шаблону
"^[0-9]+$", С помощью следующего метода-validateString:withPattern:.[self validateString:"12345" withPattern:"^[0-9]+$"];
- если "123.123" является
- шаблон
"^[0-9]+(.{1}[0-9]+)?$"- если точно 4-значные числа, без
".".
- шаблон
"^[0-9]{4}$".- если цифры без
".", и длина между 2 ~ 5.
- С узором
"^[0-9]{2,5}$".регулярное выражение можно проверить в интернет-сайт.
вспомогательная функция выглядит следующим образом.
// Validate the input string with the given pattern and // return the result as a boolean - (BOOL)validateString:(NSString *)string withPattern:(NSString *)pattern { NSError *error = nil; NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error]; NSAssert(regex, @"Unable to create regular expression"); NSRange textRange = NSMakeRange(0, string.length); NSRange matchRange = [regex rangeOfFirstMatchInString:string options:NSMatchingReportProgress range:textRange]; BOOL didValidate = NO; // Did we find a matching range if (matchRange.location != NSNotFound) didValidate = YES; return didValidate; }
Swift 3 версия:
тест на детской площадке.
import UIKit import Foundation func validate(_ str: String, pattern: String) -> Bool { if let range = str.range(of: pattern, options: .regularExpression) { let result = str.substring(with: range) print(result) return true } return false } let a = validate("123", pattern: "^[0-9]+") print(a)
этот оригинальный вопрос касался Objective-C, но он также был опубликован за несколько лет до объявления Swift. Итак, если вы пришли сюда из Google и ищете решение, которое использует Swift, вот вам:
let testString = "12345" let badCharacters = NSCharacterSet.decimalDigitCharacterSet().invertedSet if testString.rangeOfCharacterFromSet(badCharacters) == nil { print("Test string was a number") } else { print("Test string contained non-digit characters.") }
чтобы быть ясным, это функции для целых чисел в строках.
вот небольшая категория помощников, основанная на ответе Джона выше:
in .файл H
@interface NSString (NumberChecking) +(bool)isNumber:(NSString *)string; @endin .файл м
#import "NSString+NumberChecking.h" @implementation NSString (NumberChecking) +(bool)isNumber { if([self rangeOfCharacterFromSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]].location == NSNotFound) { return YES; }else { return NO; } } @endиспользование:
#import "NSString+NumberChecking.h" if([someString isNumber]) { NSLog(@"is a number"); }else { NSLog(@"not a number"); }
Swift 3 решение может быть как:
extension String { var doubleValue:Double? { return NumberFormatter().number(from:self)?.doubleValue } var integerValue:Int? { return NumberFormatter().number(from:self)?.intValue } var isNumber:Bool { get { let badCharacters = NSCharacterSet.decimalDigits.inverted return (self.rangeOfCharacter(from: badCharacters) == nil) } } }
Swift 3 Решение Если нужно проверить, что строка имеет только цифры:
CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: myString))
еще один вариант:
- (BOOL)isValidNumber:(NSString*)text regex:(NSString*)regex { @try { NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex]; return [predicate evaluateWithObject:text]; } @catch (NSException *exception) { assert(false); return NO; } }пример использования:
BOOL isValid = [self isValidNumber:@"1234" regex:@"^[0-9]+$"];
проверить, если строка является числом может быть полезно
int i = [@"12.3" rangeOfCharacterFromSet: [ [NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet] ].location; if (i == NSNotFound) { //is a number }
расширение Swift:
extension NSString { func isNumString() -> Bool { let numbers = NSCharacterSet(charactersInString: "0123456789.").invertedSet let range = self.rangeOfCharacterFromSet(numbers).location if range == NSNotFound { return true } return false } }
Для Swift 3
var onlyDigits: CharacterSet = CharacterSet.decimalDigits.inverted if testString.rangeOfCharacter(from: onlyDigits) == nil { // String only consist digits 0-9 }
расширение @John Calsbeekответ, и уточнение @Jeff и @gyratory circusС комментариями.
+ (BOOL)doesContainDigitsOnly:(NSString *)string { NSCharacterSet *nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; BOOL containsDigitsOnly = [string rangeOfCharacterFromSet:nonDigits].location == NSNotFound; return containsDigitsOnly; } + (BOOL)doesContainNonDigitsOnly:(NSString *)string { NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet]; BOOL containsNonDigitsOnly = [string rangeOfCharacterFromSet:digits].location == NSNotFound; return containsNonDigitsOnly; }могут быть добавлены в качестве методов категорию
NSString- (BOOL)doesContainDigitsOnly { NSCharacterSet *nonDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet]; BOOL containsDigitsOnly = [self rangeOfCharacterFromSet:nonDigits].location == NSNotFound; return containsDigitsOnly; } - (BOOL)doesContainNonDigitsOnly { NSCharacterSet *digits = [NSCharacterSet decimalDigitCharacterSet]; BOOL containsNonDigitsOnly = [self rangeOfCharacterFromSet:digits].location == NSNotFound; return containsNonDigitsOnly; }
Comments