কীভাবে কোনও এনএসএসআরটিংকে এনএসএনম্বারে রূপান্তর করতে হয়


569

আমি কিভাবে রূপান্তর করতে পারেন NSStringকোনো আদিম ডাটা টাইপ (যেমন একটি নম্বর ধারণকারী int, float, char, unsigned int, ইত্যাদি)? সমস্যাটি হ'ল রান টাইমে কোন সংখ্যার স্ট্রিংটি থাকবে তা আমি জানি না।

এটি কীভাবে করবেন তা সম্পর্কে আমার ধারণা আছে তবে আমি নিশ্চিত নই যে এটি কোনও ধরণের, স্বাক্ষরবিহীন এবং ভাসমান পয়েন্টের মানগুলির সাথেও কাজ করে:

long long scannedNumber;
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanLongLong:&scannedNumber]; 
NSNumber *number = [NSNumber numberWithLongLong: scannedNumber];

সাহায্যের জন্য ধন্যবাদ.

উত্তর:


1245

একটি ব্যবহার করুন NSNumberFormatter:

NSNumberFormatter *f = [[NSNumberFormatter alloc] init];
f.numberStyle = NSNumberFormatterDecimalStyle;
NSNumber *myNumber = [f numberFromString:@"42"];

যদি স্ট্রিংটি কোনও বৈধ সংখ্যা না হয় তবে myNumberতা হবে nil। এটি যদি একটি বৈধ সংখ্যা হয়, তবে NSNumberএটি আসলে কী ধরণের সংখ্যা তা নির্ধারণ করার জন্য এখন আপনার সমস্ত ধার্মিকতা রয়েছে।


16
লোকেরা যেখানে এটি কাজ করছে বলে মনে হচ্ছে না: এটি আপনার লোকেলের সাথে সম্পর্কিত কিনা তা পরীক্ষা করুন। ডিএসএল হিসাবে এনএসএনম্বারফর্মেটর (যতদূর আমি জানি) মার্কিন লোকেল ব্যবহার করে, অর্থাৎ দশমিক বিভাজকটি প্রত্যাশা করে "।" অক্ষর। আপনি যদি ভগ্নাংশটি আলাদা করতে "," ব্যবহার করেন তবে আপনার বর্তমান লোকেলটি ব্যবহার করতে আপনাকে ফর্ম্যাটরটি বলতে হবে: [f setLocale: [NSLocale currentLocale]];
পিল

2
@ পিলটি ডিফল্টরূপে লোকেলটি হ'ল +currentLocaleতবে আপনি সঠিক; স্টাফটিকে মানব-পঠনযোগ্য ফর্মে রূপান্তর করার সময় সর্বদা লোকাল বিবেচনা করতে হবে।
ডেভ ডিলং

আপনি কোথায় খুঁজে পেয়েছেন যে এটি ডিফল্টরূপে বর্তমান লোকাল ছিল? আমি নিশ্চিত করতে পারি যে ফ্রেম স্ট্রিং এমনকি একটি ফরাসী ফোনে যেখানে কমা ব্যবহৃত হয় সেখানে ডট নোটেশন ব্যবহার করছে। আমি নিশ্চিত করতে পারি যে ডিফল্টরূপে, আপনি যখন একটি সংখ্যা আউটপুট করেন, এটি ডিফল্টরূপে বর্তমান লোকাল ব্যবহার করে
এলায়ার

তবে স্ট্রিংটিতে অন্তর্নিহিত বা ভাসমান দুটি থাকতে পারে কি?
জেনকোড

179

আপনি ব্যবহার করতে পারেন -[NSString integerValue], -[NSString floatValue]ইত্যাদি তবে সঠিক (লোকেল সংবেদনশীল, ইত্যাদি) উপায় এই কাজ করতে ব্যবহার করা -[NSNumberFormatter numberFromString:]হয় যা আপনি একটি NSNumber উপযুক্ত লোকেল থেকে রূপান্তরিত দিতে এবং সেটিংস দেওয়া হবে NSNumberFormatter(তত্সহ তা ভাসমান অনুমতি দেবে পয়েন্ট মান)।


27
+ q পরিস্থিতির উপর নির্ভর করে অ-লোকাল-সংবেদনশীল আসলে সঠিক উপায় হতে পারে।
থিলো

2
আমাকে @"2000"একটি রূপান্তর করতে হয়েছিল intএবং দুর্দান্তভাবে [@"2000" integerValue]কাজ করেছিল এবং আমার ক্ষেত্রে এটি একটু সহজ simp
বেসি

2
এই পদ্ধতির মধ্যে রয়েছে বিশাল পারফরম্যান্সের পার্থক্য।
টম অ্যান্ডারসন

2
এটি আরসি-র সাথে কাজ করে না: এটি এনএসআইন্টারকে এনএসএনম্বারে রূপান্তরিত করবে না। আমাকে আরও ব্যবহার করতে হবে[NSNumber numberWithInteger ...]
শিখর

থিলো যা বলেছিল। "সঠিক" এবং "স্থানীয় সংবেদনশীল" সমার্থক শব্দ নয়। করণীয়টি সঠিকভাবে নির্ভর করে যে সংখ্যাটি প্রথম স্থানে স্ট্রিংয়ে ਕਿਵੇਂ এসেছিল। আপনি যদি এটি ব্যবহারকারীর ইনপুট থেকে পড়েন তবে স্থানীয় সংবেদনশীল আপনি যা চান তা হ'ল। অন্য যে কোনও উত্স থেকে (যেমন আপনি এটি প্রোগ্রামে রেখেছেন, আপনি এটি কিছু বাহ্যিক এপিআই ইত্যাদির প্রতিক্রিয়ার অংশ হিসাবে গ্রাস করছেন) স্থানীয় সংবেদনশীল উপযুক্ত নয় এবং এমনকি ভুল ফলাফলও দিতে পারে।
আরথ

138

উদ্দেশ্য গ

(দ্রষ্টব্য: এই পদ্ধতিটি পার্থক্যযুক্ত লোকেলগুলির সাথে দুর্দান্ত খেলছে না, তবে এটির তুলনায় কিছুটা দ্রুত NSNumberFormatter)

NSNumber *num1 = @([@"42" intValue]);
NSNumber *num2 = @([@"42.42" floatValue]);

দ্রুতগতি

সরল কিন্তু নোংরা উপায়

// Swift 1.2
if let intValue = "42".toInt() {
    let number1 = NSNumber(integer:intValue)
}

// Swift 2.0
let number2 = Int("42')

// Swift 3.0
NSDecimalNumber(string: "42.42") 

// Using NSNumber
let number3 = NSNumber(float:("42.42" as NSString).floatValue)

এক্সটেনশন-ওয়ে এটি ভাল, কারণ এটি লোকাল এবং দশমিকের সাথে দুর্দান্ত খেলবে play

extension String {

    var numberValue:NSNumber? {
        let formatter = NSNumberFormatter()
        formatter.numberStyle = .DecimalStyle
        return formatter.number(from: self)
    }
}

এখন আপনি সহজভাবে করতে পারেন:

let someFloat = "42.42".numberValue
let someInt = "42".numberValue

1
আমি যখন প্রোফাইলিংয়ের উপর ভিত্তি করে প্রচুর পরিমাণে স্ট্রিংয়ের মানগুলি পার্সিংয়ের উপর ভিত্তি করে এটি পছন্দ করি। এই বাক্য গঠনটি বরং ততক্ষণে একটি এনএসএনম্বার ফর্ম্যাটার ব্যবহার করে এনএসএনম্বারে স্ট্রিংকে পার্স করতে ব্যয় সময় উল্লেখযোগ্য পরিমাণে হ্রাস পেয়েছিল। এবং হ্যাঁ এনএসএনম্বার ফর্ম্যাটারটি ক্যাশেড এবং পুনরায় ব্যবহার করা হয়েছিল।
অ্যান্ড্রয়েডার

3
এই প্রশ্নটি জিজ্ঞাসা করা হলে এই আক্ষরিক সিনট্যাক্সের অস্তিত্ব ছিল না। আমি আজকাল যদিও এটি সঠিক উত্তর বলতে চাই।
ক্রিস

1
আমি একমত, কিন্তু নোট যে অন্যান্য বেশ কিছু দেশে ব্যবহার ,এবং .অন্যান্য উপায় কাছাকাছি (যেমন 42.000,42কিছু। floatValueসম্ভবত হিসাব করে না?
কেভিন আর

1
এটি এখানে সর্বোত্তম সমাধান, তবে আমি সবেমাত্র একটি পরীক্ষা চালিয়েছি এবং আপনি স্বাক্ষরবিহীন নির্ভুলতা হারাবেন তাই আউট দেখুন !!!
Stoff81

আমার ব্যবহারের ক্ষেত্রে, আমার কোনও এনএসএসটিংয়ের একটি এনএসএনम्बर অভিধান কী পাওয়া দরকার, তাই @([@"42" intValue])নিখুঁতভাবে কাজ করে। লোকাল নিয়ে চিন্তিত নন।
চক ক্রুটসিংগার

86

ইন্টিজার দিয়ে শুরু স্ট্রিং জন্য যেমন, @"123", @"456 ft", @"7.89", ইত্যাদি, ব্যবহার -[NSString integerValue]

সুতরাং, @([@"12.8 lbs" integerValue])করছেন মত [NSNumber numberWithInteger:12]


50

আপনি এটি করতে পারেন:

NSNumber *number = @([dictionary[@"id"] intValue]]);

আনন্দ কর!


26

আপনি যদি জানেন যে আপনি পূর্ণসংখ্যা প্রাপ্ত হন তবে আপনি এটি ব্যবহার করতে পারেন:

NSString* val = @"12";
[NSNumber numberWithInt:[val intValue]];

11

অন্যের যে ঘন্টার মধ্যে আমি ঘোরাঘুরি করেছি তার ঘন্টা বাঁচাতে এখানে এনএসএনম্বার ফর্ম্যাটারের স্থানীয় নমুনা এনএসটিস্ট্রিং (এক্সকোড 3.2.4, ওএসএক্স 10.6) পড়ার একটি নমুনা রয়েছে। সাবধান: এটি যখন পিছনের ফাঁকা জায়গাগুলি হ্যান্ডেল করতে পারে ("8,765.4" কাজ করে), এটি শীর্ষস্থানীয় সাদা স্থান পরিচালনা করতে পারে না এবং এটি বিপথগামী পাঠ্য অক্ষরগুলি পরিচালনা করতে পারে না। (খারাপ ইনপুট স্ট্রিং: "8" এবং "8 কিউ" এবং "8 কিউ"।)

NSString *tempStr = @"8,765.4";  
     // localization allows other thousands separators, also.
NSNumberFormatter * myNumFormatter = [[NSNumberFormatter alloc] init];
[myNumFormatter setLocale:[NSLocale currentLocale]]; // happen by default?
[myNumFormatter setFormatterBehavior:NSNumberFormatterBehavior10_4];
     // next line is very important!
[myNumFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; // crucial

NSNumber *tempNum = [myNumFormatter numberFromString:tempStr];
NSLog(@"string '%@' gives NSNumber '%@' with intValue '%i'", 
    tempStr, tempNum, [tempNum intValue]);
[myNumFormatter release];  // good citizen

এটি আমার পক্ষে কাজ করে না আমি এক্সকোড ৪.৩.২ দিয়ে 5.0 এর জন্য বিকাশ করছি। কোন ধারণা কেন?
এসিপ্যাডস

6

আমি একটি স্ট্রিং একটি ডাবল রূপান্তর করতে চেয়েছিলেন। উপরের উত্তরটি আমার পক্ষে বেশ কার্যকর হয়নি। তবে এটি করেছে: উদ্দেশ্য-সি-তে স্ট্রিং রূপান্তর কীভাবে করবেন?

আমি যা কিছু করেছি তা হ'ল:

double myDouble = [myString doubleValue];

এটি NSInteger কে NSNumber এ রূপান্তর করে না। এটি এটিকে ডাবল রূপান্তর করে।
FabKremer

5

সবাইকে ধন্যবাদ! আমি সম্মিলিত প্রতিক্রিয়া এবং অবশেষে পাঠ্য ইনপুট (স্ট্রিং) থেকে পূর্ণসংখ্যায় রূপান্তরিত করতে পরিচালনা করি। এছাড়াও এটি আমাকে ইনপুট পূর্ণসংখ্যা কিনা তা বলতে পারে :)

NSNumberFormatter * f = [[NSNumberFormatter alloc] init];
[f setNumberStyle:NSNumberFormatterDecimalStyle];
NSNumber * myNumber = [f numberFromString:thresholdInput.text];

int minThreshold = [myNumber intValue]; 

NSLog(@"Setting for minThreshold %i", minThreshold);

if ((int)minThreshold < 1 )
{
    NSLog(@"Not a number");
}
else
{
    NSLog(@"Setting for integer minThreshold %i", minThreshold);
}
[f release];

4

আমি মনে করি এনএসডিসিমাল নাম্বার এটি করবে:

উদাহরণ:

NSNumber *theNumber = [NSDecimalNumber decimalNumberWithString:[stringVariable text]]];

এনএসডিসিমাল নাম্বার এনএসএনমের একটি সাবক্লাস, সুতরাং অন্তর্নিহিত ingালাই অনুমোদিত।


2

সি এর মান সম্পর্কে কি atoi?

int num = atoi([scannedNumber cStringUsingEncoding:NSUTF8StringEncoding]);

আপনি কি মনে করেন যে এখানে কোনও ক্যাভেট রয়েছে?


2

আপনি শুধু ব্যবহার করতে পারেন [string intValue]বা [string floatValue]বা [string doubleValue]ইত্যাদি

আপনি ক্লাসও ব্যবহার করতে পারেন NSNumberFormatter:





0

আমি জানি এটি খুব দেরী হয়েছে তবে নীচের কোডটি আমার পক্ষে কাজ করছে।

এই কোড ব্যবহার করে দেখুন

NSNumber *number = @([dictionary[@"keyValue"] intValue]]);

এটি আপনাকে সাহায্য করতে পারে। ধন্যবাদ


0

এটা চেষ্টা কর

NSNumber *yourNumber = [NSNumber numberWithLongLong:[yourString longLongValue]];

দ্রষ্টব্য - আমি আমার প্রয়োজন অনুযায়ী লংলংভ্যালু ব্যবহার করেছি। আপনি আপনার প্রয়োজনীয়তার উপর নির্ভর করে পূর্ণসংখ্যা, লংভ্যালু বা অন্য কোনও ফর্ম্যাটও ব্যবহার করতে পারেন।


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