Выяснить, является ли строка числом или нет



Как мы можем проверить, если строка состоит только из цифр. Я вынимаю подстроку из строки и хочу проверить, является ли она числовой подстрокой или нет.



NSString *newString = [myString substringWithRange:NSMakeRange(2,3)];
700   14  

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]+$"];
  1. если "123.123" является
    • шаблон "^[0-9]+(.{1}[0-9]+)?$"
  2. если точно 4-значные числа, без ".".
    • шаблон "^[0-9]{4}$".
  3. если цифры без ".", и длина между 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;

@end

in .файл м

#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

    Ничего не найдено.