স্ট্রিংটি সংখ্যাসঙ্গিক কিনা তা সন্ধান করছেন


93

স্ট্রিংটি কেবল সংখ্যা দ্বারা গঠিত কিনা তা আমরা কীভাবে পরীক্ষা করতে পারি। আমি একটি স্ট্রিং থেকে একটি স্ট্রিং বের করছি এবং এটি একটি সংখ্যাসূচক স্ট্রিং কিনা তা পরীক্ষা করতে চাই।

NSString *newString = [myString substringWithRange:NSMakeRange(2,3)];

উত্তর:


242

এখানে একটি উপায় যা একটি সংখ্যা হিসাবে স্ট্রিংটি পার্স করার চেষ্টা সীমাবদ্ধ নির্ভুলতার উপর নির্ভর করে না:

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

দেখুন +[NSCharacterSet decimalDigitCharacterSet]এবং -[NSString rangeOfCharacterFromSet:]


6
এটি @ "231.123" এর জন্য সত্য: // নতুন স্ট্রিং কেবল 0 থেকে 9 এবং .চারিত্রিক অঙ্কটি নিয়ে থাকে
নিকোলাস টাইলার

5
NSMutableCharacterSet * DigitsAndDots = [NSMutableCharacterSet ডেসিমালডিজিটচর্যাকটারসেট]; [ডিজিটসএন্ডডটস অ্যাডচ্যারাকটারসইনস্ট্রিং: @ "।"]; NSCharacterSet * notD DigitsNorDots = [DigitsAndDots invertedSet]; // এছাড়াও, "ইনভার্টসেট" আনার জন্য থ্যাঙ্ক্স। আমি এর অস্তিত্ব সম্পর্কে জানতাম না
কোড্রুট

5
দ্রষ্টব্য: এই পদ্ধতিটি @ "" কে একটি সংখ্যা হিসাবে বিবেচনা করে; যদি প্রযোজ্য হয় তবে আপনার [নতুন স্ট্রিং দৈর্ঘ্য]> 0 পরীক্ষা করার দরকারও রয়েছে দয়া করে আমাকে ভুল করে রাখুন কিনা তা আমাকে জানান।
মার্ককিম

4
@ সুপেরেকনোবফ মনে হয় এটি আইওএস-এ পরিবর্তিত হয়েছে is এটি নিশ্চিত হওয়ার পরিবর্তে এটি ব্যবহার করা যেতে পারে:[[NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet]]
নিকোলাস টাইলার

4
@ কেএমজিআরবুনভ আমি মনে করি না যে এনএসচার্যাক্টসেটটি আসলে একটি ব্যাকিং সেট সংরক্ষণ করছে যা সেটে প্রতিটি চরিত্র ধারণ করে। আমার সন্দেহ invertedSetহয় যে এমন একটি শ্রেণি ফিরে আসছিল যা সেটটি এটি তৈরি করা ফর্মটি আবৃত করে, এবং সমস্ত প্রশ্নের জন্য বিপরীত মান দেয়। তবে আমি নিশ্চিতভাবে জানি না।
জন কলসবিেক

33

আমি এনএসএনম্বারফর্মেটর ক্লাস numberFromString:থেকে পদ্ধতিটি ব্যবহার করার পরামর্শ দেব , যেন সংখ্যাটি বৈধ নয়, এটি শূন্য হবে; অন্যথায়, এটি আপনাকে একটি এনএসএনম্বার ফিরিয়ে দেবে।

NSNumberFormatter *nf = [[[NSNumberFormatter alloc] init] autorelease];
BOOL isDecimal = [nf numberFromString:newString] != nil;

আপনি কি নিশ্চিত যে এটি "" 124 এসবিডি "এর জন্য কোনও বৈধ নম্বর ফেরত দেবে না?
টমি

না, এনএসএনম্বারফর্ম্যাটর এবং এনএসএস স্ক্যানার উভয়ই NOআপনার স্ট্রিংয়ের জন্য ফিরে আসবে । জানার মতো মূল্যবান: তারা YESসাদা জায়গার সাথে প্যাড করা সংখ্যার জন্যও ফিরে আসে । বিটিডব্লিউ, আমি আপনার উত্তরে সবেমাত্র কিছু আসল কোড স্নিপেট যুক্ত করেছি, আশা করি আপনার আপত্তি নেই।
রিজেক্সিডেন্ট

"বৈধ পূর্ণসংখ্যার উপস্থাপনা" খুঁজে পেয়ে ডকুমেন্টেশন অনুযায়ী এনএসএস স্ক্যানারের সেই স্ট্রিংয়ের জন্য 'হ্যাঁ' ফিরিয়ে দেওয়া উচিত। তদ্ব্যতীত, এটি আইওএস ৪.৩.২ এ পরীক্ষা করে ঠিক তা করেছে did তবে, এনএসএনম্বারফর্মেটরটি শূন্য করে নি।
টমি

এটি ধরা দেয় না '।' যা আমার জন্য প্রয়োজন। @ জন কলসবিকের কাছ থেকে উত্তর সুন্দরভাবে কাজ করেছে।
দামিয়ান

কয়েক অঙ্কের সমস্ত অঙ্ক সহ স্ট্রিংয়ের জন্য কী ঘটে? NSNumber তৈরির কি সীমা আছে?
বিনৌ

12

নিয়মিত অভিব্যক্তি দ্বারা, নিদর্শন দ্বারা "^[0-9]+$", নিম্নলিখিত পদ্ধতি সহ যাচাই করুন -validateString:withPattern:

[self validateString:"12345" withPattern:"^[0-9]+$"];
  1. যদি "123.123" বিবেচনা করা হয়
    • প্যাটার্ন সহ "^[0-9]+(.{1}[0-9]+)?$"
  2. হুবহু 4 ডিজিট সংখ্যা, ছাড়া "."
    • প্যাটার্ন সঙ্গে "^[0-9]{4}$"
  3. যদি সংখ্যা ছাড়াই হয় "."এবং দৈর্ঘ্য 2 ~ 5 এর মধ্যে হয়।
    • প্যাটার্ন সঙ্গে "^[0-9]{2,5}$"
  4. বিয়োগ চিহ্ন সহ: "^-?\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;
}

সুইফট 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)

আমি সুইফট 3 এর জন্য এ জাতীয় চেষ্টা করেছি 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).
ম্যাথি আরসান

আমি 3 দ্রুতগতির জন্য সঠিকটি জানি না I আমার ভুল হলে আমাকে সংশোধন করুন।
মথি আরসান

কীভাবে ঠিকreturn matchRange.location != NSNotFound;
লাইমারিড

বিয়োগ চিহ্ন সম্পর্কে কি?
টমাস

@ থমাস উইথ ^-?\d+$, আমি এটি সাইটে যাচাই করেছি: regex101.com
এচলোলিউ

9

আপনি একটি এনএসএস স্ক্যানার তৈরি করতে এবং স্ট্রিংটি কেবল স্ক্যান করতে পারেন:

NSDecimal decimalValue;
NSScanner *sc = [NSScanner scannerWithString:newString];
[sc scanDecimal:&decimalValue];
BOOL isDecimal = [sc isAtEnd];

পরীক্ষা করে দেখুন NSScanner এর ডকুমেন্টেশন আরো পদ্ধতি থেকে পছন্দ করে নিন জন্য।


এটি কি আপনাকে কেবল কমপক্ষে প্রথম চরিত্রটি সংখ্যাসূচক কিনা তা বলবে না?
টমি

আমার খারাপ। চূড়ান্ত কল ভুলে গেছেন isAtEnd
রেজেক্সিডেন্ট

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");
}

আপনি যদি গ্রহণযোগ্য চরিত্রগুলির উপর সম্পূর্ণ নিয়ন্ত্রণ চান তবে অন্য একটি এনএসচার্যাকারসেট কারখানা পদ্ধতি ব্যবহার করুন।


আমি এইভাবে পছন্দ করি। যদিও এটি খুব পরিষ্কার বলে মনে হচ্ছে না, এটি কোনও এনএসএসস্ট্রিংয়ে "অ-অঙ্কগুলি" আছে কিনা তা যাচাই করার একটি খুব সহজ এবং মূল ভিত্তি বান্ধব। + আমি মনে করি যে এটি অন্য যে কোনও রোবট-ভিত্তিক উপায়ের চেয়ে অনেক দ্রুত (যদিও আমরা সম্ভবত এখানে পারফরম্যান্সের দিকে খুব বেশি নজর দিচ্ছি না)।
নিমবল্টন

আমি বিশ্বাস করি যে স্ট্রিংবাই ট্রিমিংচ্যারাকটারসআইনসেট কেবল স্ট্রিংয়ের শুরু এবং শেষের ছাঁটাই করে
ব্রোডি রবার্টসন

@ ব্রোডি রবার্টসন: তা করে। যা এই উত্তরটির জন্য সামান্যতম বিবেচ্য নয়। এই পরীক্ষাটি কোন পরীক্ষায় ব্যর্থ হবে বলে আপনি মনে করেন?
টমি

@ টমি, পুনর্বিবেচনা করার পরে আমি আপনার উত্তরটি বুঝতে পেরেছি এবং এটি বৈধ এবং উত্সাহিত হবে তবে আমাকে পুনরুদ্ধারের অনুমতি দেওয়ার জন্য আপনার সম্পাদনা করা দরকার
ব্রডি রবার্টসন

6

এই মূল প্রশ্নটি উদ্দেশ্য-সি সম্পর্কে ছিল, তবে এটি সুইফট ঘোষণার কয়েক বছর আগে পোস্ট করা হয়েছিল। সুতরাং, আপনি যদি গুগল থেকে এখানে আসছেন এবং সুইফট ব্যবহার করে এমন কোনও সমাধান খুঁজছেন তবে আপনি এখানে যান:

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.")
}

6

স্ট্রিংটিতে কেবলমাত্র সংখ্যা রয়েছে তা যাচাই করার জন্য সুইফট 3 সমাধানের প্রয়োজন হয়:

CharacterSet.decimalDigits.isSuperset(of: CharacterSet(charactersIn: myString))

4
পরিষ্কার এবং সুন্দর, সেরা সমাধান। আমি পছন্দ করি যে এটি অপ্রয়োজনীয় .invertedএবং অন্যান্য ক্রিয়া করে না ।
ড্যানি পি

4

পরিষ্কার হতে হবে, স্ট্রিং মধ্যে পূর্ণসংখ্যার জন্য এই ফাংশন।

উপরের জন এর জবাবের ভিত্তিতে হেরেস হেল্প্পাল হেল্প্পার ক্যাটাগরি:

ইন .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");
}

4

সুইফট 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)
        }
    }
}

2

এর একটি এক্সটেনশান @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;
}

2

জন কলসবিকের উত্তর প্রায় সঠিক তবে কিছু ইউনিকোড প্রান্তের মামলা বাদ দেয়।

এর জন্য ডকুমেন্টেশন অনুযায়ী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
}

1

তবুও অন্য একটি বিকল্প:

- (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]+$"];

0

যদি স্ট্রিংটি একটি নম্বর হতে পারে তবে এটি সাহায্যকারী হতে পারে তা পরীক্ষা করুন

int i = [@"12.3" rangeOfCharacterFromSet: [ [NSCharacterSet characterSetWithCharactersInString:@"0123456789."] invertedSet] ].location;

if (i == NSNotFound) {
     //is a number
}

0

সুইফট এক্সটেনশন:

extension NSString {
func isNumString() -> Bool {
    let numbers = NSCharacterSet(charactersInString: "0123456789.").invertedSet
    let range = self.rangeOfCharacterFromSet(numbers).location
    if range == NSNotFound {
        return true
    }
    return false
}  }

0

সুইফট 3 এর জন্য

var onlyDigits: CharacterSet = CharacterSet.decimalDigits.inverted
if testString.rangeOfCharacter(from: onlyDigits) == nil {
  // String only consist digits 0-9
}

0

যখন আপনার কাছে অঙ্কগুলি মিশ্রিত ভাষা থেকে থাকে , যেগুলি 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
}

0

সবচেয়ে সহজ এবং নির্ভরযোগ্য উপায় হিসাবে 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


0

সরল স্ট্রিং এক্সটেনশন লিখেছিল:

extension String {
    var isNumeric: Bool {
        return self.rangeOfCharacter(from: CharacterSet.decimalDigits.inverted) == nil
    }
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.