NSString को NSNumber में कैसे बदलें


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
उन लोगों के लिए जहां यह काम नहीं करता है: जांचें कि क्या यह आपके स्थान से संबंधित है। NSNumberFormatter (जहाँ तक मुझे पता है) डिफ़ॉल्ट रूप से US लोकेल का उपयोग करता है, अर्थात दशमलव विभाजक के "होने" की अपेक्षा करता है। चरित्र। यदि आप अंश को अलग करने के लिए "," का उपयोग करते हैं, तो आपको अपने वर्तमान स्थान का उपयोग करने के लिए फ़ॉर्मेटर को बताने की आवश्यकता हो सकती है: [f setLocale: [NSLocale currentLocale]];
पिल्ले

2
@ डिफ़ॉल्ट रूप से लोकेल है +currentLocale, लेकिन आप सही हैं; मानव-पठनीय रूप से सामान को और परिवर्तित करने से निपटने के लिए हमेशा लोकेल पर विचार करना चाहिए।
डेव डोंगलांग

आपने कहां पाया कि यह डिफ़ॉल्ट रूप से currentLocale था? मैं पुष्टि कर सकता हूं कि नंबरफ्रॉमस्ट्रिंग एक फ्रांसीसी फोन पर भी डॉट नोटेशन का उपयोग कर रहा है, जहां अल्पविराम का उपयोग किया जाता है। मैं पुष्टि कर सकता हूं कि जब आप एक नंबर आउटपुट करते हैं, तो यह डिफ़ॉल्ट रूप से वर्तमान लोकेल का उपयोग करता है
allair

लेकिन क्या होगा अगर स्ट्रिंग में इंट या फ्लोट शामिल हो सकते हैं?
४० बजे जीनकोड

179

आप उपयोग कर सकते हैं -[NSString integerValue], -[NSString floatValue], आदि हालांकि, सही (वातावरण के प्रति संवेदनशील, आदि) तरीका यह है उपयोग करने के लिए है -[NSNumberFormatter numberFromString:]जो आपको एक NSNumber उचित स्थान से परिवर्तित देने के लिए और की सेटिंग दिया जाएगा NSNumberFormatter(चाहे वह चल अनुमति देगा बिंदु मान)।


27
+ q स्थिति के आधार पर, गैर-स्थानीय-संवेदनशील वास्तव में सही तरीका हो सकता है।
थिलो सेप

2
मुझे @"2000"एक में परिवर्तित होना पड़ा intऔर [@"2000" integerValue]अच्छी तरह से काम किया और मेरे मामले के लिए थोड़ा सरल है।
बेसी

2
इन विधियों में भारी प्रदर्शन अंतर भी हैं।
टॉम एंडरसन

2
यह ARC के साथ काम नहीं करता है: यह NSInteger को NSNumber में नहीं बदलेगा। मुझे आगे का उपयोग करना है[NSNumber numberWithInteger ...]
शिक्षार्थी

@ थिलियो ने क्या कहा। "सही" और "स्थानीय-संवेदनशील" समानार्थक शब्द नहीं हैं। वास्तव में करने के लिए सही बात इस बात पर निर्भर करती है कि पहले स्थान पर संख्या स्ट्रिंग में कैसे आई। यदि आप इसे उपयोगकर्ता इनपुट से पढ़ते हैं, तो स्थानीय-संवेदनशील वही है जो आप चाहते हैं। किसी भी अन्य स्रोत से (यानी आप इसे वहां प्रोग्रामेटिक रूप से डालते हैं, आप इसे कुछ बाहरी एपीआई, आदि की प्रतिक्रिया के हिस्से के रूप में उपभोग कर रहे हैं) स्थानीय-संवेदनशील उचित नहीं है और यहां तक ​​कि गलत परिणाम भी दे सकता है।
अरथ

138

उद्देश्य सी

(नोट: यह विधि अंतर स्थानों के साथ अच्छा नहीं खेलती है, लेकिन a से थोड़ी तेज़ है 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)

एक्सटेंशन-वे यह बेहतर है, वास्तव में, क्योंकि यह अच्छी तरह से स्थानों और दशमलव के साथ खेलेंगे।

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
मैं इसे प्रोफाइलिंग पर आधारित पसंद करता हूं जब मैं बड़ी मात्रा में स्ट्रिंग मानों को पार्स कर रहा था। इस सिंटैक्स का उपयोग करने के बजाय फिर NSNumberFormatter ने NSNumber को स्ट्रिंग को पार्स करने में लगने वाले समय में महत्वपूर्ण कमी की। और हाँ NSNumberFormatter कैश और पुन: उपयोग किया गया था।
एंड्रॉइड

3
जब यह प्रश्न पूछा गया था तब यह शाब्दिक वाक्य रचना मौजूद नहीं थी। मैं कहूंगा कि यह आजकल सही उत्तर है।
क्रिस

1
मैं सहमत हूं, लेकिन ध्यान दें कि कुछ अन्य देश ,और .दूसरे तरीके का उपयोग करते हैं (जैसे 42.000,42। कुछ के लिए floatValueशायद हिसाब नहीं है?
केविन आर

1
यह यहाँ पर सबसे अच्छा समाधान है, हालांकि मैंने अभी एक परीक्षण चलाया है और आप अहस्ताक्षरित सटीक खो देंगे, ताकि देखो!
स्टॉफ़81

मेरे उपयोग के मामले में, मुझे एक NSString से NSNumber शब्दकोश कुंजी प्राप्त करने की आवश्यकता थी, इसलिए @([@"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

यहां NSNumberFormatter रीडिंग लोकल नंबर NSString (xCode 3.2.4, osX 10.6) का वर्किंग सैंपल है, दूसरों को बचाने के लिए जो घंटे मैंने अभी-अभी गड़बड़ किए हैं, उन्हें बचाने के लिए। खबरदार: जबकि यह पीछे आने वाले कंबल ("8,765.4") काम कर सकता है, यह प्रमुख सफेद स्थान को संभाल नहीं सकता है और यह आवारा पाठ पात्रों को संभाल नहीं सकता है। (खराब इनपुट स्ट्रिंग्स: "8" और "8q" और "8 q")।

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

यह मेरे लिए काम नहीं करता है। मैं xcode 4.3.2 के साथ 5.0 के लिए विकसित कर रहा हूं। किसी भी विचार क्यों?
3

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

मुझे लगता है कि NSDecimalNumber यह करेगा:

उदाहरण:

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

NSDecimalNumber NSNumber का उपवर्ग है, इसलिए निहित कास्टिंग की अनुमति है।


2

सी के मानक के बारे में क्या atoi?

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

क्या आपको लगता है कि कोई चेतावनी है?


2

आप बस [string intValue]या [string floatValue]या [string doubleValue]आदि का उपयोग कर सकते हैं

आप NSNumberFormatterवर्ग का उपयोग भी कर सकते हैं :


2

आप इस कोड को 8.3.3 ios 10.3 समर्थन की तरह भी कर सकते हैं

[NSNumber numberWithInt:[@"put your string here" intValue]]



0

मुझे पता है कि यह बहुत देर हो चुकी है लेकिन नीचे कोड मेरे लिए काम कर रहा है।

इस कोड को आज़माएं

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

यह आपकी मदद कर सकता है। धन्यवाद


0

इसे इस्तेमाल करे

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

नोट - मैंने अपनी आवश्यकता के अनुसार longLongValue का उपयोग किया है। आप अपनी आवश्यकता के आधार पर पूर्णांकव्यू, लॉन्गवैल्यू, या किसी अन्य प्रारूप का भी उपयोग कर सकते हैं।


-1
extension String {

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

let someFloat = "12.34".numberValue
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.