找出字符串是否为数字

Abh*_*nav 91 iphone cocoa-touch objective-c nsstring ios

我们如何检查字符串是否仅由数字组成.我从字符串中取出一个子字符串,并想检查它是否是一个数字子字符串.

NSString *newString = [myString substringWithRange:NSMakeRange(2,3)];
Run Code Online (Sandbox Code Playgroud)

Joh*_*eek 235

这是一种不依赖于尝试将字符串解析为数字的有限精度的方法:

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

+[NSCharacterSet decimalDigitCharacterSet]-[NSString rangeOfCharacterFromSet:].

  • 这对于@"231.123"是正确的,所以:// newString只包含0到9的数字和`.`字符 (6认同)
  • NSMutableCharacterSet*digitsAndDots = [NSMutableCharacterSet decimalDigitCharacterSet]; [digitsAndDots addCharactersInString:@"."]; NSCharacterSet*notDigitsNorDots = [digitsAndDots invertedSet]; //也是,thanx用于引入"invertedSet".我不知道它的存在 (5认同)
  • 注意:此方法认为@""是一个数字; 如果适用,您可能还需要检查[newString lenght]> 0.如果我错了请告诉我. (5认同)
  • @Supertecnoboff看来这在IOS中已经发生了变化.这可以用来代替确定:`[[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet]]` (2认同)
  • @KMGorbunov我不认为NSCharacterSet实际上存储的是包含集合中每个字符的后备集.我怀疑`invertedSet`返回一个包装它创建的表的类,并为所有查询返回相反的值.但我不确定. (2认同)

Sam*_*Sam 31

我建议使用NSNumberFormatter类中的numberFromString:方法,就好像数字无效一样,它将返回nil; 否则,它会返回一个NSNumber.

NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease];
BOOL isDecimal = [nf numberFromString:newString] != nil;
Run Code Online (Sandbox Code Playgroud)


Aec*_*Liu 10

通过正则表达式,按模式"^[0-9]+$",使用以下方法进行验证-validateString:withPattern:.

[self validateString:"12345" withPattern:"^[0-9]+$"];
Run Code Online (Sandbox Code Playgroud)
  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;
}
Run Code Online (Sandbox Code Playgroud)

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)
Run Code Online (Sandbox Code Playgroud)


Reg*_*ent 8

您可以创建NSScanner并只扫描字符串:

NSDecimal decimalValue;
NSScanner *sc = [NSScanner scannerWithString:newString];
[sc scanDecimal:&decimalValue];
BOOL isDecimal = [sc isAtEnd];
Run Code Online (Sandbox Code Playgroud)

查看NSScanner的文档,了解更多可供选择的方法.


Tom*_*mmy 6

我认为检查给定字符串中的每个字符都是数字的最简单方法可能是:

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");
}
Run Code Online (Sandbox Code Playgroud)

如果要完全控制可接受的字符,请使用其他NSCharacterSet工厂方法之一.


Two*_*aws 6

这个原始问题是关于Objective-C的,但它也是在Swift宣布之前发布的.所以,如果你是从谷歌来到这里并正在寻找一个使用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.")
}
Run Code Online (Sandbox Code Playgroud)


pla*_*a__ 6

如果需要验证字符串仅包含数字,则使用Swift 3解决方案:

CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: myString))
Run Code Online (Sandbox Code Playgroud)