답변:
다음은 문자열을 숫자로 구문 분석하려는 제한된 정밀도에 의존하지 않는 한 가지 방법입니다.
NSCharacterSet* notDigits = [[NSCharacterSet decimalDigitCharacterSet] invertedSet];
if ([newString rangeOfCharacterFromSet:notDigits].location == NSNotFound)
{
// newString consists only of the digits 0 through 9
}
+[NSCharacterSet decimalDigitCharacterSet]
및을 참조하십시오 -[NSString rangeOfCharacterFromSet:]
.
[[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet]]
invertedSet
그것이 생성 된 양식을 래핑하고 모든 쿼리에 대해 반대 값을 반환하는 클래스를 반환한다고 생각 합니다. 그러나 나는 확실하지 않다.
NSNumberFormatter 클래스 의 numberFromString:
메서드를 사용하는 것이 좋습니다. 마치 숫자가 유효하지 않으면 nil을 반환합니다. 그렇지 않으면 NSNumber를 반환합니다.
NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease];
BOOL isDecimal = [nf numberFromString:newString] != nil;
NO
문자열을 반환 합니다. 또한 알아 두어야 할 사항 : YES
공백으로 채워진 숫자에 대해서도 반환 합니다. Btw, 방금 귀하의 답변에 실제 코드 스 니펫을 추가했습니다.
"^[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;
}
놀이터에서 테스트하십시오.
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).
return matchRange.location != NSNotFound;
^-?\d+$
, 사이트에서 확인했습니다. regex101.com
NSScanner를 만들고 단순히 문자열을 스캔 할 수 있습니다.
NSDecimal decimalValue;
NSScanner *sc = [NSScanner scannerWithString:newString];
[sc scanDecimal:&decimalValue];
BOOL isDecimal = [sc isAtEnd];
선택할 수있는 더 많은 방법은 NSScanner의 문서 를 확인하십시오 .
isAtEnd
.
주어진 문자열 내의 모든 문자가 숫자인지 확인하는 가장 쉬운 방법은 아마도 다음과 같습니다.
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 팩토리 메소드 중 하나를 사용하십시오.
이 원래 질문은 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 솔루션 :
CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: myString))
.inverted
하고 다른 행동을 하지 않는 것이 좋다 .
명확하게 말하자면, 이것은 문자열의 정수에 대해 작동합니다.
위의 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");
}
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 Calsbeek의 대답 은 거의 정확하지만 일부 유니 코드 가장자리 사례를 생략합니다.
에 대한 설명서에decimalDigitCharacterSet
따라 해당 세트에는 유니 코드로 분류 된 모든 문자가 Nd
. 따라서 그들의 대답은 다음을 받아 들일 것입니다.
१
(U + 0967 DEVANAGARI DIGIT ONE)᠑
(U + 1811 MONGOLIAN DIGIT ONE)𝟙
(U + 1D7D9 수학 이중 구조 DIGIT ONE)어떤 의미에서 이것은 옳지 만-의 각 문자 Nd
는 십진수로 매핑됩니다-거의 확실하게 질문자가 예상 한 것과는 다릅니다. 이 글을 쓰는 현재 610 개의 코드 포인트가으로 분류되어 있으며Nd
, 그중 10 개만 예상 문자 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
}
또 다른 옵션 :
- (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]+$"];
의 확장 @ 존 Calsbeek 의 대답, 그리고 설명 @Jeff 및 @gyratory 서커스 님의 댓글.
+ (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;
}
문자열이 숫자인지 테스트하면 도움이 될 수 있습니다.
int i = [@"12.3" rangeOfCharacterFromSet: [ [NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet] ].location;
if (i == NSNotFound) {
//is a number
}
Swift 3의 경우
var onlyDigits: CharacterSet = CharacterSet.decimalDigits.inverted
if testString.rangeOfCharacter(from: onlyDigits) == nil {
// String only consist digits 0-9
}
당신이에서있는 자리가있을 때 혼합 언어 , 그 사용 (또는 안) 0-9 숫자 형식을 어떤 번호를 확인하는 정규식을 실행해야합니다, 다음 일은 모든 자리로 변환하는 것입니다 0- 9 형식 (실제 값이 필요한 경우) :
// Will look for any language digits
let regex = try NSRegularExpression(pattern: "[^[:digit:]]", options: .caseInsensitive)
let digitsString = regex.stringByReplacingMatches(in: string,
options: NSRegularExpression.MatchingOptions(rawValue: 0),
range: NSMakeRange(0, string.count), withTemplate: "")
// Converting the digits to be 0-9 format
let numberFormatter = NumberFormatter()
numberFormatter.locale = Locale(identifier: "EN")
let finalValue = numberFormatter.number(from: digitsString)
if let finalValue = finalValue {
let actualValue = finalValue.doubleValue
}
가장 쉽고 신뢰할 수있는 방법은 Double
결과가 nil
합법적 인 숫자로 형성 될 수없는 경우 로 캐스팅 하는 것입니다 .
let strings = ["test", "123", "123.2", "-123", "123-3", "123..22", ".02"]
let validNumbers = strings.compactMap(Double.init)
print(validNumbers)
// prints [123.0, 123.2, -123.0, 0.02]
설명서의 추가 정보 : https://developer.apple.com/documentation/swift/double/2926277-init
.
문자 로만 구성됩니다.