Как преобразовать NSString в NSNumber
как я могу преобразовать NSString содержащий номер любого примитивного типа данных (например,int,float,char,unsigned int и т. д.)? Проблема в том, что я не знаю, какой тип числа будет содержать строка во время выполнения.
у меня есть идея, как это сделать, но я не уверен, что это работает с любым типом, а также без знака и с плавающей запятой:
long long scannedNumber;
NSScanner *scanner = [NSScanner scannerWithString:aString];
[scanner scanLongLong:&scannedNumber];
NSNumber *number = [NSNumber numberWithLongLong: scannedNumber];
Спасибо за помощь.
18 ответов:
использовать
NSNumberFormatter:NSNumberFormatter *f = [[NSNumberFormatter alloc] init]; f.numberStyle = NSNumberFormatterDecimalStyle; NSNumber *myNumber = [f numberFromString:@"42"];если строка не является допустимым числом, то
myNumberбудетnil. Если это действительное число, то теперь у вас есть всеNSNumberхорошо бы выяснить, что это за число на самом деле.
можно использовать
-[NSString integerValue],-[NSString floatValue]и т. д. Однако правильный (чувствительный к локали и т. д.) способ сделать это-использовать-[NSNumberFormatter numberFromString:]который даст вам NSNumber, преобразованный из соответствующего языкового стандарта и учитывая настройкиNSNumberFormatter(в том числе, позволит ли это значения с плавающей точкой).
С
(Примечание: этот метод не играет хорошо с разными локалями, но немного быстрее, чем 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
для строк, начинающихся с целых чисел, например,
@"123",@"456 ft",@"7.89"и т. д. используйте-[NSString integerValue].и
@([@"12.8 lbs" integerValue])- это[NSNumber numberWithInteger:12].
Если вы знаете, что вы получаете целые числа, вы можете использовать:
NSString* val = @"12"; [NSNumber numberWithInt:[val intValue]];
вот рабочий образец 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
Я хотел преобразовать строку в двойную. Этот ответ выше не совсем работает для меня. Но это произошло:Как сделать преобразование строк в Objective-C?
все я сделал:
double myDouble = [myString doubleValue];
Спасибо Всем! Я комбинирую обратную связь и, наконец, удается преобразовать из ввода текста ( строка ) в целое число. Плюс он может сказать мне, является ли ввод число :)
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];
Я думаю, что NSDecimalNumber сделает это:
пример:
NSNumber *theNumber = [NSDecimalNumber decimalNumberWithString:[stringVariable text]]];NSDecimalNumber является подклассом NSNumber, поэтому допускается неявное приведение.
Как насчет стандарта C
atoi?int num = atoi([scannedNumber cStringUsingEncoding:NSUTF8StringEncoding]);Как вы думаете, есть ли какие-либо предостережения?
вы можете просто использовать
[string intValue]или[string floatValue]или[string doubleValue]etcвы также можете использовать
NSNumberFormatterкласс:
вы также можете сделать, как этот код 8.3.3 ios 10.3 поддержка
[NSNumber numberWithInt:[@"put your string here" intValue]]
NSDecimalNumber *myNumber = [NSDecimalNumber decimalNumberWithString:@"123.45"]; NSLog(@"My Number : %@",myNumber);
Я знаю, что это очень поздно, но ниже код работает для меня.
попробуйте этот код
NSNumber *number = @([dictionary[@"keyValue"] intValue]]);Это может помочь вам. Спасибо
попробуй такое
NSNumber *yourNumber = [NSNumber numberWithLongLong:[yourString longLongValue]];Примечание-я использовал longLongValue в соответствии с моим требованием. Вы также можете использовать integerValue, longValue или любой другой формат в зависимости от вашего требования.
extension String { var numberValue:NSNumber? { let formatter = NumberFormatter() formatter.numberStyle = .decimal return formatter.number(from: self) } } let someFloat = "12.34".numberValue
Comments