जवाबों:
यहां एक तरीका है जो स्ट्रिंग को एक संख्या के रूप में पार्स करने के सीमित परिशुद्धता पर भरोसा नहीं करता है:
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:से विधि का उपयोग करने का सुझाव देता हूं , जैसे कि संख्या मान्य नहीं है, यह शून्य वापस आ जाएगी; अन्यथा, यह आपको एक 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 फ़ैक्टरी विधियों में से एक का उपयोग करें।
यह मूल प्रश्न ऑब्जेक्टिव-सी के बारे में था, लेकिन स्विफ्ट की घोषणा के वर्षों पहले भी इसे पोस्ट किया गया था। इसलिए, यदि आप Google से यहां आ रहे हैं और ऐसे समाधान की तलाश कर रहे हैं जो स्विफ्ट का उपयोग करे, तो आप यहां जाएं:
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.")
}
यदि स्विफ्ट में केवल अंक हैं, तो 3 समाधान स्विफ्ट करें:
CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: myString))
.invertedऔर अन्य कार्य नहीं करता है ।
स्पष्ट होना, स्ट्रिंग्स में पूर्णांकों के लिए यह कार्य करता है।
जॉन के उत्तर के आधार पर एक छोटा सहायक श्रेणी
.ह फ़ाइल
@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");
}
स्विफ्ट 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)
}
}
}
जॉन कलसेबेक का उत्तर लगभग सही है लेकिन कुछ यूनिकोड किनारे के मामलों को छोड़ देता है।
प्रति के लिए दस्तावेज़decimalDigitCharacterSet , कि सेट के रूप में यूनिकोड द्वारा वर्गीकृत सभी पात्रों में शामिल हैं Nd। इस प्रकार उनका जवाब दूसरों के बीच में स्वीकार करेंगे:
१ (U + 0967 देवनागरी डिजिटल एक)᠑ (U + 1811 मंगोलियाई DIGIT वन)𝟙 (U + 1D7D9 मैथेमेटिकल डबेल-स्ट्रक्च डिजिटल एक)हालांकि कुछ अर्थों में यह सही है - प्रत्येक चरित्र Ndएक दशमलव अंक में मैप करता है - यह लगभग निश्चित रूप से नहीं है जो पूछने वाले की उम्मीद है। इस लेखन के रूप में वहाँ हैं 610 कोड बिंदुओं को वर्गीकृत किया गया हैNd , जिनमें से केवल दस अक्षर 0(U + 0030) हैं9 ) हैं।
समस्या को ठीक करने के लिए, बस उन वर्णों को निर्दिष्ट करें जो स्वीकार्य हैं:
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]+$"];
@ जॉन्स केल्बेक के उत्तर का विस्तार , और @ जेफ़ और @ सर्जिकल सर्कस की टिप्पणियों का स्पष्टीकरण ।
+ (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
}
स्विफ्ट एक्सटेंशन:
extension NSString {
func isNumString() -> Bool {
let numbers = NSCharacterSet(charactersInString: "0123456789.").invertedSet
let range = self.rangeOfCharacterFromSet(numbers).location
if range == NSNotFound {
return true
}
return false
} }
स्विफ्ट 3 के लिए
var onlyDigits: CharacterSet = CharacterSet.decimalDigits.inverted
if testString.rangeOfCharacter(from: onlyDigits) == nil {
// String only consist digits 0-9
}
जब आपके पास अंक हैं जो मिश्रित भाषाओं से हैं , तो 0-9 अंकों के प्रारूप का उपयोग करें (या न करें), आपको एक regex चलाने की आवश्यकता होगी जो किसी भी संख्या को खोजेगा, अगली बात सभी अंकों को 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
.चरित्र के होते हैं