NSString থেকে সংখ্যা বাদে সমস্ত সরান


157

কিছু ফোন নম্বর বিন্যাসিত হওয়ায় আমার কাছে একটি এনএসএসস্ট্রিং (ফোন নম্বর) রয়েছে parent আমি স্ট্রিং থেকে সংখ্যা বাদে সমস্ত অক্ষরকে কীভাবে সরিয়ে ফেলব?

উত্তর:


375

পুরানো প্রশ্ন, তবে কীভাবে:

  NSString *newString = [[origString componentsSeparatedByCharactersInSet:
                [[NSCharacterSet decimalDigitCharacterSet] invertedSet]] 
                componentsJoinedByString:@""];

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


6
ধন্যবাদ! অন্যান্য নতুনদের জন্য, আপনি নিজের কাস্টম এনএসচ্যাকারসিট তৈরি করে তৈরি করতে পারেনNSCharacterSet *myCharSet = [NSCharacterSet characterSetWithCharactersInString:@"charactersGoHere"]
গুপ্ত্রন

1
দুর্দান্ত ধন্যবাদ! শুধু আমার কৌতূহলের জন্য, আপনার কি ধারণা আছে কেন NSString *pureNumbers = [pureNumbers stringByTrimmingCharactersInSet: [NSCharacterSet decimalDigitCharacterSet] invertedSet]কাজ করছে না?
টমাস বেসনেহার

1
@ টমমেপ স্ট্রিংবাই ট্রাইমিংচ্যাকার্টারসইনসেটটি কেবল স্ট্রিংয়ের শুরু এবং শেষ থেকে সরিয়ে দেয়, তাই এটি প্রথম অ-মিলের চরিত্রের পরে বা শেষ মেলানো অক্ষরের আগে প্রভাব ফেলবে না।
সাইমনো

আমি কেবল সংখ্যা এবং বর্ণমালা রাখতে চাই, আমি এটি কীভাবে করব?
জ্যাকি

1
@ জ্যাকি উপরের উদাহরণে আপনি এমন একটির [NSCharacterSet decimalDigitCharacterSet]সাথে প্রতিস্থাপন করবেন যেখানে কেবল সংখ্যা এবং অক্ষর রয়েছে। আপনি একটি তৈরি করে এক গঠন করা যেতে পারে NSMutableCharaterSetএবং ক্ষণস্থায়ী একটি decimalDigitCharacterSet, uppercaseLetterCharacterSetএবং lowercaseLetterCharacterSetকরতে formUnionWithCharacterSet:। নোট যাতে letterCharacterSetচিহ্নগুলিও অন্তর্ভুক্ত করে, তাই নিম্ন- এবং বড় হাতের সংস্করণ ব্যবহার।
কদম

75

অন্যান্য উত্তরগুলির হিসাবে নিয়মিত এক্সপ্রেশন লাইব্রেরি ব্যবহার করার দরকার নেই - আপনি যে ক্লাসটির পরে ডাকা হচ্ছে তাকে বলা হচ্ছে NSScanner। এটি নিম্নলিখিত হিসাবে ব্যবহৃত হয়:

NSString *originalString = @"(123) 123123 abc";
NSMutableString *strippedString = [NSMutableString 
        stringWithCapacity:originalString.length];

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet 
        characterSetWithCharactersInString:@"0123456789"];

while ([scanner isAtEnd] == NO) {
  NSString *buffer;
  if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
    [strippedString appendString:buffer];

  } else {
    [scanner setScanLocation:([scanner scanLocation] + 1)];
  }
}

NSLog(@"%@", strippedString); // "123123123"

সম্পাদনা করুন: আমি কোডটি আপডেট করেছি কারণ মূলটি আমার মাথার উপরের অংশে লেখা ছিল এবং আমি অনুভব করেছি যে লোকদের সঠিক দিকে নির্দেশ করা যথেষ্ট enough দেখে মনে হচ্ছে লোকেরা কোডের পরে তারা কেবল তাদের আবেদনে সরাসরি কপি-পেস্ট করতে পারে।

আমি এটিও মেনে নিয়েছি যে মাইকেল পেলজ-শেরম্যানের সমাধান ব্যবহারের চেয়ে উপযুক্ত NSScanner, সুতরাং আপনি এটি একবার দেখে নিতে পারেন।


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

4
এটি এনএসসিআর্যাকটারসেটের একটি + দশমিকডিজিটচ্যারাকটারসেট পদ্ধতি রয়েছে যা আপনাকে সমস্ত দশমিক সংখ্যা দেবে তা জেনে রাখা সহজ হতে পারে। এটি সেট নাথান তালিকার তুলনায় কিছুটা আলাদা, কারণ এটিতে দশমিক সংখ্যার প্রতিনিধিত্বকারী সমস্ত চিহ্ন রয়েছে, উদাহরণস্বরূপ, আরবি-ইন্ডিক অঙ্কগুলি (١٢٣٤٥ ইত্যাদি)। আপনার আবেদনের উপর নির্ভর করে এটি মাঝে মাঝে সমস্যা হতে পারে তবে সাধারণত এটি ভাল বা নিরপেক্ষ এবং টাইপ করতে কিছুটা ছোট orter
রব নেপিয়ার

আমি পুরোপুরি নিশ্চিত যে এই উত্তরটি আসলে কার্যকর হয় না এবং সমস্যাটির পক্ষে সত্যই সঠিক পদ্ধতির নয়। আপনি যদি দেখানো হিসাবে কোডটি বাস্তবে চেষ্টা করে থাকেন (প্রথমে এনএসএলগে প্রথমে একটি @ যুক্ত করে, এটি একটি অবজেক্ট স্ট্রিং তৈরি করে), আপনি দেখতে পাবেন এটি হয় <নাল> বা ক্র্যাশগুলি মুদ্রণ করে। কেন? আমার উত্তর নীচে দেখুন।
জ্যাক নটিং 13

অন্য উত্তরের প্রয়োজন নেই - মন্তব্যগুলির জন্য এটিই। মাইকেল পেলজ-শেরম্যানের সমাধানের একটি উল্লেখ সহ আমি সমাধানটি আপডেট করেছি।
নাথান ডি ভ্রিজ

4
এটা waaaay জটিল।
রায়স্ট

63

গ্রহণযোগ্য উত্তর যা জিজ্ঞাসা করা হচ্ছে তার জন্য ওভারকিল। এটি অনেক সহজ:

NSString *pureNumbers = [[phoneNumberString componentsSeparatedByCharactersInSet:[[NSCharacterSet decimalDigitCharacterSet] invertedSet]] componentsJoinedByString:@""];

2
(বর্তমানে) গৃহীত উত্তর এটির সাথে কম-বেশি অভিন্ন, তবে 13 মাস আগে পোস্ট করা হয়েছিল।
কালেব

আমি যখন এই উত্তরটি দিয়েছিলাম তখন এটির উত্তর ছিল না। যদিও মনে হচ্ছে বর্তমান উত্তরটি ইতিমধ্যে প্রস্তাবিত ছিল এবং আমি এটি মিস করেছি: web.archive.org/web/20101115214033/http://stackoverflow.com/…
ইয়াসিন ফিলিলি

30

এটি দুর্দান্ত, তবে আইফোন 3.0 এসডিকে কোডটি আমার পক্ষে কাজ করে না।

আপনি এখানে প্রদর্শিত হিসাবে আমি স্ট্রিপ স্ট্রিং সংজ্ঞায়িত BAD ACCESS errorকরলে, scanCharactersFromSet:intoStringকল করার পরে এটি মুদ্রণের চেষ্টা করার সময় আমি একটি পাই ।

যদি আমি এটির মতো করে করি:

NSMutableString *strippedString = [NSMutableString stringWithCapacity:10];

আমি একটি খালি স্ট্রিং দিয়ে শেষ করি, তবে কোডটি ক্রাশ হয় না।

পরিবর্তে আমাকে ভাল পুরানো সি অবলম্বন করতে হয়েছিল:

for (int i=0; i<[phoneNumber length]; i++) {
    if (isdigit([phoneNumber characterAtIndex:i])) {
        [strippedString appendFormat:@"%c",[phoneNumber characterAtIndex:i]];
    }
}

আমি 3.0 চালাচ্ছি এবং এটি আমার জন্য কাজ করে। ভ্রিসের আরও জনপ্রিয় উত্তরটি কাজ করে না।
নিও 42

এক নম্বর উত্তর আমার পক্ষে কাজ করবে না। স্ক্যানারটি একবার () বা এ পৌঁছানোর পরে থামে - ভাল পুরানো সি !! ধন্যবাদ
জেফ

2
কেবলমাত্র নোট করুন যে '+' ফোন নম্বরটির জন্য অনুমোদিত অক্ষর।
প্রেসেলা

27

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

NSString *condensedPhoneNumber = [[phoneNumber componentsSeparatedByCharactersInSet:
              [[NSCharacterSet characterSetWithCharactersInString:@"+0123456789"]
              invertedSet]] 
              componentsJoinedByString:@""];

সুইফ্ট এক্সপ্রেশন হয়

var phoneNumber = " +1 (234) 567-1000 "
var allowedCharactersSet = NSMutableCharacterSet.decimalDigitCharacterSet()
allowedCharactersSet.addCharactersInString("+")
var condensedPhoneNumber = phoneNumber.componentsSeparatedByCharactersInSet(allowedCharactersSet.invertedSet).joinWithSeparator("")

যা সাধারণ আন্তর্জাতিক ফোন নম্বর ফর্ম্যাট হিসাবে +12345671000 দেয়।


2
এটি তালিকার সেরা সমাধান, বিশেষত যদি আপনার আন্তর্জাতিক ফোন নম্বরগুলির জন্য প্লাস চিহ্নের প্রয়োজন হয়।
ইউএক্সইউইওএস

কোনও কারণে, একটি উল্টানো চরিত্রের সেটটি ব্যবহার করে পারফরম্যান্স যতদূর যায় sc কেউ যদি জানতে পারে যে এটি একটি ভিত্তিহীন ভয় কিনা?
ডিভাইস 1

এই এক কাজ! আপনি কি এর কাজ ব্যাখ্যা করতে পারেন? @ অ্যালেক্স
জয়প্রকাশ দুবে

11

এটির সুইফ্ট সংস্করণ এখানে।

import UIKit
import Foundation
var phoneNumber = " 1 (888) 555-5551    "
var strippedPhoneNumber = "".join(phoneNumber.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))

সুইফট 2.0: phoneNumber.componentsSeparatedByCharactersInSet (। NSCharacterSet.decimalDigitCharacterSet () invertedSet) .joinWithSeparator ( "")
iluvatar_GR

11

সর্বাধিক জনপ্রিয় উত্তরের সুইফ্ট সংস্করণ:

var newString = join("", oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet))

সম্পাদনা: সুইফট 2-এর সিনট্যাক্স

let newString = oldString.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")

সম্পাদনা করুন: সুইফ্ট 3-এর সিনট্যাক্স

let newString = oldString.components(separatedBy: CharacterSet.decimalDigits.inverted).joined(separator: "")

দশমিক পৃথক প্রতীক রাখার উপায় আছে? ডিটের ডিফল্ট সেটিংসের কাজ হিসাবে ডট (বা কমা)? আপনার সমাধান সংখ্যা ব্যতীত সমস্ত কিছুই নির্মূল করে
নিকোলাস

5

উদাহরণের জন্য ধন্যবাদ। অরিজিনাল স্ট্রিংয়ের একটি অক্ষর যদি চরিত্রসেট অবজেক্টের সংখ্যার মধ্যে না পাওয়া যায় তবে এটিতে কেবলমাত্র একটি জিনিস স্ক্যানের লোকেশন বৃদ্ধি পাচ্ছে missing আমি এটি ঠিক করতে অন্য একটি}} বিবৃতি যুক্ত করেছি।

NSString *originalString = @"(123) 123123 abc";
NSMutableString *strippedString = [NSMutableString 
        stringWithCapacity:originalString.length];

NSScanner *scanner = [NSScanner scannerWithString:originalString];
NSCharacterSet *numbers = [NSCharacterSet 
        characterSetWithCharactersInString:@"0123456789"];

while ([scanner isAtEnd] == NO) {
  NSString *buffer;
  if ([scanner scanCharactersFromSet:numbers intoString:&buffer]) {
    [strippedString appendString:buffer];
  }
  // --------- Add the following to get out of endless loop
  else {
     [scanner setScanLocation:([scanner scanLocation] + 1)];
  }    
  // --------- End of addition
}

NSLog(@"%@", strippedString); // "123123123"

4

এটি কেবল মোবাইল নম্বর গ্রহণ করে

NSString * strippedNumber = [mobileNumber stringByReplacingOccurrencesOfString:@"[^0-9]" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, [mobileNumber length])];

3

এটি লক্ষণীয় যে গ্রহণযোগ্য componentsSeparatedByCharactersInSet:এবং componentsJoinedByString:ভিত্তিক উত্তর কোনও মেমরি-দক্ষ সমাধান নয় worth এটি অক্ষর সেট, একটি অ্যারের জন্য এবং একটি নতুন স্ট্রিংয়ের জন্য মেমরি বরাদ্দ করে। এগুলি কেবলমাত্র অস্থায়ী বরাদ্দ থাকলেও, প্রচুর পরিমাণে স্ট্রিং প্রক্রিয়াজাতকরণ দ্রুত মেমরিটি পূরণ করতে পারে।

একটি মেমরি বন্ধুত্বপূর্ণ পদ্ধতির জায়গায় স্ট্রিংয়ের মিউটেবল কপি চালনা করা হবে। এনএসএসস্ট্রিংয়ের উপর একটি বিভাগে:

-(NSString *)stringWithNonDigitsRemoved {
    static NSCharacterSet *decimalDigits;
    if (!decimalDigits) {
        decimalDigits = [NSCharacterSet decimalDigitCharacterSet];
    }
    NSMutableString *stringWithNonDigitsRemoved = [self mutableCopy];
    for (CFIndex index = 0; index < stringWithNonDigitsRemoved.length; ++index) {
        unichar c = [stringWithNonDigitsRemoved characterAtIndex: index];
        if (![decimalDigits characterIsMember: c]) {
            [stringWithNonDigitsRemoved deleteCharactersInRange: NSMakeRange(index, 1)];
            index -= 1;
        }
    }
    return [stringWithNonDigitsRemoved copy];
}

দুটি পদ্ধতির প্রোফাইলিং প্রায় 2/3 কম মেমরি ব্যবহার করে এটি দেখিয়েছে।


2

পরিবর্তনীয় স্ট্রিংয়ে আপনি নিয়মিত প্রকাশ করতে পারেন:

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:
                                @"[^\\d]"
                                options:0
                                error:nil];

[regex replaceMatchesInString:str
                      options:0 
                        range:NSMakeRange(0, str.length) 
                 withTemplate:@""];

1

বিস্তৃত সমস্যাগুলির সাথে সহায়তা করার জন্য শীর্ষ সমাধানটি বিভাগ হিসাবে তৈরি করুন:

ইন্টারফেস:

@interface NSString (easyReplace)
- (NSString *)stringByReplacingCharactersNotInSet:(NSCharacterSet *)set 
                                             with:(NSString *)string;
@end

Implemenation:

@implementation NSString (easyReplace)
- (NSString *)stringByReplacingCharactersNotInSet:(NSCharacterSet *)set 
                                             with:(NSString *)string
{
    NSMutableString *strippedString = [NSMutableString
                                       stringWithCapacity:self.length];

    NSScanner *scanner = [NSScanner scannerWithString:self];

    while ([scanner isAtEnd] == NO) {
        NSString *buffer;
        if ([scanner scanCharactersFromSet:set intoString:&buffer]) {
            [strippedString appendString:buffer];
        } else {
            [scanner setScanLocation:([scanner scanLocation] + 1)];
            [strippedString appendString:string];
        }
    }
    return [NSString stringWithString:strippedString];
}
@end

ব্যবহার:

NSString *strippedString = 
 [originalString stringByReplacingCharactersNotInSet:
   [NSCharacterSet setWithCharactersInString:@"01234567890" 
                                        with:@""];

1

সুইফট 3

let notNumberCharacters = NSCharacterSet.decimalDigits.inverted
let intString = yourString.trimmingCharacters(in: notNumberCharacters)

এটি কেবল শুরু এবং শেষ থেকে অ-অঙ্কের অক্ষরগুলি ছাঁটাই করবে।
শেবুকা


0

উম। প্রথম উত্তরটি আমার কাছে সম্পূর্ণ ভুল বলে মনে হচ্ছে। এনএসএস স্ক্যানারটি সত্যই পার্সিংয়ের জন্য বোঝানো হয়েছে। রেজেক্সের বিপরীতে, এটিতে আপনি একবারে স্ট্রিংকে একটি ক্ষুদ্র অংশকে বিশ্লেষণ করে চলেছেন। আপনি এটি একটি স্ট্রিং দিয়ে সূচনা করেন এবং এটি স্ট্রিংটি কতটা পারা গেছে তার একটি সূচক বজায় রাখে; এই সূচকটি সর্বদা এর রেফারেন্স পয়েন্ট হয় এবং আপনি যে কোনও আদেশ দেন তা সেই বিন্দুটির সাথে সম্পর্কিত। আপনি এটিকে বলছেন, "ঠিক আছে, আমাকে এই সেটটিতে পরবর্তী অক্ষরগুলি দিন" বা "স্ট্রিংয়ের মধ্যে আপনি যে পূর্ণসংখ্যার সন্ধান করেন আমাকে দিন" এবং যেগুলি বর্তমান সূচীতে শুরু হয় এবং যতক্ষণ না তাদের কিছু খুঁজে পায় ততক্ষণ এগিয়ে চলে যান ম্যাচ. যদি ইতিমধ্যে প্রথম অক্ষরটি মেলে না, তবে পদ্ধতিটি কোনও উত্তর দেয় না, এবং সূচকটি বৃদ্ধি পায় না।

প্রথম উদাহরণের কোডটি হ'ল দশমিক অক্ষরের জন্য "(123) 456-7890" স্ক্যান করছে, যা ইতিমধ্যে প্রথম অক্ষর থেকে ব্যর্থ হয়েছে, সুতরাং স্ক্যানচ্যাকারফ্রেমসেটকে কল করুন: স্ট্রিং: পাস-ইন স্ট্রিপ স্ট্রিংকে একা ফেলে দেয় এবং কোনও কিছুই ফেরত দেয় না; কোডটি সম্পূর্ণরূপে রিটার্ন মানটি পরীক্ষা করে উপেক্ষা করে স্ট্রাইপ স্ট্রিংকে নিযুক্ত করে রেখে। এমনকি যদি প্রথম অক্ষরটি একটি অঙ্ক ছিল, তবে সেই কোডটি ব্যর্থ হবে, যেহেতু এটি কেবল প্রথম ড্যাশ বা পেরেন বা যে কোনও কিছু না পাওয়া পর্যন্ত এটি খুঁজে পাওয়া অঙ্কগুলি ফিরিয়ে দেবে।

আপনি যদি সত্যিই এনএসএস স্ক্যানারটি ব্যবহার করতে চান তবে আপনি এটির মতো কোনও কিছু একটি লুপে রাখতে পারেন এবং কোনও কোনও ফেরতের মূল্যের জন্য সন্ধান করতে পারেন এবং যদি আপনি এটি পান যে আপনি স্ক্যানের অবস্থান বাড়িয়ে আবার স্ক্যান করতে পারেন; এবং আপনাকে isAtEnd এবং yada yada yada পরীক্ষা করতে হবে। সংক্ষেপে, কাজের জন্য ভুল সরঞ্জাম। মাইকেল এর সমাধান আরও ভাল।


0

ফোন এক্সট্রাকশনের জন্য যারা অনুসন্ধান করছেন তাদের জন্য, আপনি এনএসডিটাডেক্টর ব্যবহার করে কোনও পাঠ্য থেকে ফোন নম্বরগুলি বের করতে পারেন, উদাহরণস্বরূপ:

NSString *userBody = @"This is a text with 30612312232 my phone";
if (userBody != nil) {
    NSError *error = NULL;
    NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypePhoneNumber error:&error];
    NSArray *matches = [detector matchesInString:userBody options:0 range:NSMakeRange(0, [userBody length])];
    if (matches != nil) {
        for (NSTextCheckingResult *match in matches) {
            if ([match resultType] == NSTextCheckingTypePhoneNumber) {
                DbgLog(@"Found phone number %@", [match phoneNumber]);
            }
        }
    }
}

`


0

এই সাধারণ ক্রিয়াকলাপটিকে সহজ করার জন্য আমি এনএসএসটিংয়ে একটি বিভাগ তৈরি করেছি।

NSString + + AllowCharactersInSet.h

@interface NSString (AllowCharactersInSet)

- (NSString *)stringByAllowingOnlyCharactersInSet:(NSCharacterSet *)characterSet;

@end

NSString + + AllowCharactersInSet.m

@implementation NSString (AllowCharactersInSet)

- (NSString *)stringByAllowingOnlyCharactersInSet:(NSCharacterSet *)characterSet {
    NSMutableString *strippedString = [NSMutableString
                                   stringWithCapacity:self.length];

    NSScanner *scanner = [NSScanner scannerWithString:self];

    while (!scanner.isAtEnd) {
        NSString *buffer = nil;

        if ([scanner scanCharactersFromSet:characterSet intoString:&buffer]) {
            [strippedString appendString:buffer];
        } else {
            scanner.scanLocation = scanner.scanLocation + 1;
        }
    }

    return strippedString;
}

@end

0

আমি মনে করি বর্তমানে সর্বোত্তম উপায় হ'ল:

phoneNumber.replacingOccurrences(of: "\\D",
                               with: "",
                            options: String.CompareOptions.regularExpression)

0

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

আপনি যদি প্রদর্শনের জন্য ফোন নম্বরগুলি ফর্ম্যাট করতে চান তবে এনএসএনম্বারফোর্মেটরটি একবার দেখে নেওয়া উচিত । আমি আপনাকে পরামর্শ দিচ্ছি যে এটি সম্পর্কিত টিউসের জন্য আপনি এই সম্পর্কিত এসও প্রশ্নের মাধ্যমে পড়ুন । মনে রাখবেন যে ফোন নম্বরগুলি অবস্থান এবং / অথবা লোকেলের উপর নির্ভর করে আলাদাভাবে ফর্ম্যাট করা আছে।


ওহ বেদনাদায়ক ঘন্টাগুলি আমি ভাল ফোন নম্বর ফর্ম্যাটর এবং পার্সার বিকাশ করতে ব্যয় করেছি। সংযুক্ত থ্রেডগুলি একটি ভাল শুরু, তবে প্রদর্শনের জন্য গ্লোবাল ফোন নম্বরগুলি ফর্ম্যাট করার সাধারণ ক্ষেত্রে একটি দীর্ঘ রাস্তা, এবং লিঙ্কযুক্ত থ্রেডগুলিতে উল্লিখিত আছে, অ্যাপল আপনাকে ঠিকানা বইয়ের ফোন নম্বর বিন্যাসগুলিতে কোনও অ্যাক্সেস দেয় না এবং হয় অ্যাড্রেস বুক এপিআই থেকে ফোন নম্বর কীভাবে উপস্থাপন করা হচ্ছে তাতে খুব বেমানান। প্রদর্শনের জন্য কোনও ফোন নম্বর ফর্ম্যাট করার চেয়ে কঠিন একমাত্র জিনিসটি দুটি ফোন নম্বর সমান কিনা তা নির্ধারণ করে। কমপক্ষে ওপি'র প্রশ্নটি সমস্যার সহজতম।
রব নেপিয়ার

আমি বিশ্বাস করি যে ফোন নম্বরগুলিতে ফর্ম্যাট করার সেই লিঙ্কগুলি বিভ্রান্তিমূলক, যদি না আপনি কোনও আদিম, মার্কিন কেন্দ্রিক বাস্তবায়নে খুশি হন। অ্যাপল থেকে উপযুক্ত স্থানীয় ফোন নম্বর ফর্ম্যাটারের পরিবর্তে, সঠিকভাবে এটি করার একমাত্র উপায় হ'ল ডিভাইসটি থেকে ফর্ম্যাটিং টেম্পলেটগুলি অনুলিপি করুন (ওএস ২.x এ ইউআইফোনফর্ম্যাটস.পালিস্ট) এবং ব্যবহারকারীর লোকেলের উপর নির্ভর করে টেমপ্লেটগুলি নিজেই পুনরুত্পাদন করুন। এটি একটি তুচ্ছ কাজ।
নাথান ডি ভ্রিজ

এজন্য আমি সংখ্যা বিন্যাসের স্থানীয়করণের কথা উল্লেখ করেছি। আমি এর জন্য কোনও সম্পূর্ণ সমাধানের কোনও রূপ পোস্ট করার ভান করিনি - এটি অনেক দীর্ঘ আলোচনা এবং এটিকে একটি পৃথক এসও প্রশ্ন করার জন্য আরও অর্থবোধ করতে চাই।
কুইন টেলর


-1

এখানে জন ভোগেলের উত্তরের ভিত্তিতে এটি কিছু বেসিক পরীক্ষার পাশাপাশি একটি সুইফ্ট স্ট্রিং এক্সটেনশন হিসাবে।

import Foundation
extension String {
    func stringByRemovingNonNumericCharacters() -> String {
        return self.componentsSeparatedByCharactersInSet(NSCharacterSet.decimalDigitCharacterSet().invertedSet).joinWithSeparator("")
    }
}

এবং কিছু পরীক্ষা অন্তত প্রাথমিক কার্যকারিতা প্রমাণ করে:

import XCTest

class StringExtensionTests: XCTestCase {

    func testStringByRemovingNonNumericCharacters() {

        let baseString = "123"
        var testString = baseString
        var newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString == testString)

        testString = "a123b"
        newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString == baseString)

        testString = "a=1-2_3@b"
        newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString == baseString)

        testString = "(999) 999-9999"
        newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString.characters.count == 10)
        XCTAssertTrue(newString == "9999999999")

        testString = "abc"
        newString = testString.stringByRemovingNonNumericCharacters()
        XCTAssertTrue(newString == "")
    }
}

এটি ওপি-র প্রশ্নের উত্তর দেয় তবে ",; * # +" এর মতো ফোন নম্বর সম্পর্কিত অক্ষরে রেখে সহজেই এটি পরিবর্তন করা যেতে পারে could


-4
NSString *originalPhoneNumber = @"(123) 123-456 abc";
NSCharacterSet *numbers = [[NSCharacterSet characterSetWithCharactersInString:@"0123456789"] invertedSet];
NSString *trimmedPhoneNumber = [originalPhoneNumber stringByTrimmingCharactersInSet:numbers];

];

সহজবোধ্য রাখো!


3
এটি কেবল শুরু এবং শেষ থেকে এই অক্ষরগুলি ছাঁটাই করবে।
রেডিফাইভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.