স্ট্রিংটি কেবল সংখ্যা দ্বারা গঠিত কিনা তা আমরা কীভাবে পরীক্ষা করতে পারি। আমি একটি স্ট্রিং থেকে একটি স্ট্রিং বের করছি এবং এটি একটি সংখ্যাসূচক স্ট্রিং কিনা তা পরীক্ষা করতে চাই।
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:]
।
[[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet]]
invertedSet
হয় যে এমন একটি শ্রেণি ফিরে আসছিল যা সেটটি এটি তৈরি করা ফর্মটি আবৃত করে, এবং সমস্ত প্রশ্নের জন্য বিপরীত মান দেয়। তবে আমি নিশ্চিতভাবে জানি না।
আমি এনএসএনম্বারফর্মেটর ক্লাস numberFromString:
থেকে পদ্ধতিটি ব্যবহার করার পরামর্শ দেব , যেন সংখ্যাটি বৈধ নয়, এটি শূন্য হবে; অন্যথায়, এটি আপনাকে একটি এনএসএনম্বার ফিরিয়ে দেবে।
NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease];
BOOL isDecimal = [nf numberFromString:newString] != nil;
NO
আপনার স্ট্রিংয়ের জন্য ফিরে আসবে । জানার মতো মূল্যবান: তারা YES
সাদা জায়গার সাথে প্যাড করা সংখ্যার জন্যও ফিরে আসে । বিটিডব্লিউ, আমি আপনার উত্তরে সবেমাত্র কিছু আসল কোড স্নিপেট যুক্ত করেছি, আশা করি আপনার আপত্তি নেই।
নিয়মিত অভিব্যক্তি দ্বারা, নিদর্শন দ্বারা "^[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;
আপনি একটি এনএসএস স্ক্যানার তৈরি করতে এবং স্ট্রিংটি কেবল স্ক্যান করতে পারেন:
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");
}
আপনি যদি গ্রহণযোগ্য চরিত্রগুলির উপর সম্পূর্ণ নিয়ন্ত্রণ চান তবে অন্য একটি এনএসচার্যাকারসেট কারখানা পদ্ধতি ব্যবহার করুন।
এই মূল প্রশ্নটি উদ্দেশ্য-সি সম্পর্কে ছিল, তবে এটি সুইফট ঘোষণার কয়েক বছর আগে পোস্ট করা হয়েছিল। সুতরাং, আপনি যদি গুগল থেকে এখানে আসছেন এবং সুইফট ব্যবহার করে এমন কোনও সমাধান খুঁজছেন তবে আপনি এখানে যান:
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
এবং অন্যান্য ক্রিয়া করে না ।
পরিষ্কার হতে হবে, স্ট্রিং মধ্যে পূর্ণসংখ্যার জন্য এই ফাংশন।
উপরের জন এর জবাবের ভিত্তিতে হেরেস হেল্প্পাল হেল্প্পার ক্যাটাগরি:
ইন .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");
}
সুইফট 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 এর উত্তর, এবং শোধন @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;
}
জন কলসবিকের উত্তর প্রায় সঠিক তবে কিছু ইউনিকোড প্রান্তের মামলা বাদ দেয়।
এর জন্য ডকুমেন্টেশন অনুযায়ীdecimalDigitCharacterSet
, এই সেটে ইউনিকোড হিসাবে শ্রেণিবদ্ধ সমস্ত অক্ষর অন্তর্ভুক্ত রয়েছে Nd
। সুতরাং তাদের উত্তর অন্যদের মধ্যে গ্রহণ করবে:
१
(U + 0967 দেবনাগরী ডিজিট এক)᠑
(ইউ + 1811 মঙ্গোলিয়ান ডিজিট এক)𝟙
(ইউ + 1D7D9 গাণিতিক ডাবল-স্ট্রাইক ডিজিট এক)যদিও কিছুটা অর্থে এটি সঠিক - প্রতিটি অক্ষর Nd
দশমিক অঙ্কে মানচিত্র করে - এটি প্রায় অবশ্যই প্রশ্নকর্তার প্রত্যাশা মতো নয়। এই লেখার হিসাবে 610 কোড পয়েন্ট হিসাবে শ্রেণিবদ্ধ করা হয়েছেNd
, যার মধ্যে কেবল দশটি প্রত্যাশিত অক্ষর 0
(ইউ + 0030) এর মাধ্যমে রয়েছে9
(ইউ + 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]+$"];
যদি স্ট্রিংটি একটি নম্বর হতে পারে তবে এটি সাহায্যকারী হতে পারে তা পরীক্ষা করুন
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 অঙ্কের ফর্ম্যাটগুলি ব্যবহার করে (বা না) তখন আপনার একটি রেইজেক্স চালানো দরকার যা কোনও সংখ্যার সন্ধান করবে, পরবর্তী জিনিসটি হ'ল সমস্ত সংখ্যাকে 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/docamentation/swift/double/2926277-init
সরল স্ট্রিং এক্সটেনশন লিখেছিল:
extension String {
var isNumeric: Bool {
return self.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
}
}
.
চারিত্রিক অঙ্কটি নিয়ে থাকে