Выяснить, является ли строка числовой или нет - PullRequest
89 голосов
/ 23 мая 2011

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

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

Ответы [ 17 ]

232 голосов
/ 23 мая 2011

Вот один способ, который не основан на ограниченной точности попыток разобрать строку как число:

NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
if ([newString rangeOfCharacterFromSet:notDigits].location == NSNotFound)
{
    // newString consists only of the digits 0 through 9
}

См. +[NSCharacterSet decimalDigitCharacterSet] и -[NSString rangeOfCharacterFromSet:].

31 голосов
/ 23 мая 2011

Я бы предложил использовать метод numberFromString: из класса NSNumberFormatter , так как если число недопустимо, оно вернет nil; в противном случае он вернет вам номер NSN.

NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease];
BOOL isDecimal = [nf numberFromString:newString] != nil;
10 голосов
/ 16 февраля 2016

Проверка по регулярному выражению, по шаблону "^[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)
8 голосов
/ 23 мая 2011

Вы можете создать NSScanner и просто отсканировать строку:

NSDecimal decimalValue;
NSScanner *sc = [NSScanner scannerWithString:newString];
[sc scanDecimal:&decimalValue];
BOOL isDecimal = [sc isAtEnd];

Изучите Документацию NSScanner , чтобы узнать больше методов.

6 голосов
/ 31 марта 2017

Решение Swift 3, если необходимо убедиться, что строка содержит только цифры:

CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: myString))
6 голосов
/ 23 мая 2011

Я думаю, что самый простой способ проверить, является ли каждый символ в данной строке числовым, это:

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, если вы хотите полностью контролировать допустимые символы.

5 голосов
/ 18 декабря 2015

Этот оригинальный вопрос был о 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.")
}
4 голосов
/ 28 октября 2016

Решение 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)
        }
    }
}
4 голосов
/ 04 февраля 2014

, чтобы быть понятным, эта функция для целых чисел в строках.

вот небольшая вспомогательная категория, основанная на ответе Джона выше:

в .h файле

@interface NSString (NumberChecking)

+(bool)isNumber:(NSString *)string;

@end

в .m файле

#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");
}
2 голосов
/ 26 декабря 2018

Ответ Джона Калсбека почти верен, но пропускает некоторые крайние случаи Unicode.

Согласно документации для decimalDigitCharacterSet, этот набор включает все символы, классифицированные Unicode как Nd.Таким образом, их ответ будет принимать, среди прочего:

  • (U + 0967 DEVANAGARI DIGIT ONE)
  • (U + 1811 MONGOLIAN DIGIT ONE)
  • ? (U + 1D7D9 МАТЕМАТИЧЕСКИЙ ДВОЙНОЙ ЦИФРОВОЙ ДВОЙНОЙ СТРОКИ)

Хотя в некотором смысле это правильно - каждый символ в Nd отображается в десятичную цифру - это почти наверняка нечто ожидал аскер.На момент написания этой статьи существует 610 кодовых точек, классифицированных как Nd, только десять из которых являются ожидаемыми символами от 0 (U + 0030) до 9 (U + 0039).

Чтобы исправить проблему, просто укажите те символы, которые являются приемлемыми:

NSCharacterSet* notDigits = 
    [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
if ([newString rangeOfCharacterFromSet:notDigits].location == NSNotFound)
{
    // newString consists only of the digits 0 through 9
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...