怎样判断一个字符串是否全部由数字组成。我从一个字符串中取出了一个子字符串,现在想检查它是否是一个数值型的子串。
NSString *newString = [myString substringWithRange:NSMakeRange(2,3)];
怎样判断一个字符串是否全部由数字组成。我从一个字符串中取出了一个子字符串,现在想检查它是否是一个数值型的子串。
NSString *newString = [myString substringWithRange:NSMakeRange(2,3)];
这里有一种方法不依赖于尝试将字符串解析为数字的有限精度:
NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
if ([newString rangeOfCharacterFromSet:notDigits].location == NSNotFound)
{
// newString consists only of the digits 0 through 9
}
请参阅+[NSCharacterSet decimalDigitCharacterSet]
和-[NSString rangeOfCharacterFromSet:]
。
我建议使用NSNumberFormatter类中的numberFromString:
方法,因为如果数字无效,它将返回nil;否则,它将返回NSNumber。
NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease];
BOOL isDecimal = [nf numberFromString:newString] != nil;
使用正则表达式验证,使用模式"^[0-9]+$"
,使用以下方法-validateString:withPattern:
。
[self validateString:"12345" withPattern:"^[0-9]+$"];
"^[0-9]+(.{1}[0-9]+)?$"
"."
。
"^[0-9]{4}$"
。"."
的数字,且长度在2到5之间。
"^[0-9]{2,5}$"
。"^-?\d+$"
正则表达式可以在在线网站中进行检查。
辅助函数如下。
// 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;
}
在playground中测试。
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)
func numberOnly(string: String) -> Int { let expression = "" let regex = NSRegularExpression.init(pattern: expression, options: .caseInsensitive) let numberOfMatches = regex.numberOfMatches(in: string, options: .reportProgress, range: NSRange.init(location: 0, length: string.characters.count)) if numberOfMatches == 0 { return Int(string)! } return 0 }
但是我得到了错误信息:Playground execution aborted: error: Execution was interrupted, reason: EXC_BAD_INSTRUCTION (code=EXC_I386_INVOP, subcode=0x0).
- Mathi Arasanreturn matchRange.location != NSNotFound;
好了。 - LimeRed^-?\d+$
在 https://regex101.com 网站上验证了一下。 - AechoLiu您可以创建一个 NSScanner,然后简单地扫描字符串:
NSDecimal decimalValue;
NSScanner *sc = [NSScanner scannerWithString:newString];
[sc scanDecimal:&decimalValue];
BOOL isDecimal = [sc isAtEnd];
请查看NSScanner的文档以获取更多可供选择的方法。
isAtEnd
。 - Regexident我认为检查给定字符串中的每个字符都是数字的最简单方法可能是:
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工厂方法之一。
如果需要验证字符串是否只包含数字,可以使用Swift 3的以下解决方案:
CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: myString))
.inverted
和其他操作。 - Dannie P这个问题最初是关于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.")
}
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)
}
}
}
为了明确,此功能适用于字符串中的整数。
这是一个基于John上面的答案的小助手类别:
在.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");
}
这是对@John Calsbeek回答的延伸,并澄清了@Jeff和@gyratory circus的评论。涉及到IT技术相关内容。
+ (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;
}
.
。 - string.Empty[[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet]]
- string.EmptyinvertedSet
返回的是一个类,该类包装了它所创建的集合,并对所有查询返回相反的值。但我并不确定。 - John Calsbeek