Cómo convertir un NSString en un NSNumber

¿Cómo puedo convertir un NSString contenga varios tipos de datos primitivos (por ejemplo, int , float , char , unsigned int , etc.)? El problema es que no sé qué tipo de número contendrá la cadena en tiempo de ejecución.

Tengo una idea de cómo hacerlo, pero no estoy seguro si esto funciona con cualquier tipo, también valores de punto flotante y sin signo:

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

Gracias por la ayuda.

Use un NSNumberFormatter :

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

Si la cadena no es un número válido, myNumber será nil . Si es un número válido, entonces ahora tiene todas las bondades NSNumber para averiguar qué tipo de número realmente es.

Puede usar -[NSString integerValue] , -[NSString floatValue] , etc. Sin embargo, la forma correcta (sensible a la configuración regional, etc.) de hacer esto es usar -[NSNumberFormatter numberFromString:] que le dará un NSNumber convertido de la configuración regional apropiada y dada la configuración de NSNumberFormatter (incluso si permitirá valores de coma flotante).

C objective

(Nota: este método no funciona bien con las configuraciones regionales de diferencia, pero es ligeramente más rápido que un NSNumberFormatter )

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

Rápido

Manera simple pero sucia

 // 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) 

La extensión-way Esto es mejor, realmente, porque jugará muy bien con locales y decimales.

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

Ahora puedes simplemente hacer:

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

Para cadenas que comiencen con enteros, por ejemplo, @"123" , @"456 ft" , @"7.89" , etc., use -[NSString integerValue] .

Entonces, @([@"12.8 lbs" integerValue]) es como hacer [NSNumber numberWithInteger:12] .

También puedes hacer esto:

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

¡Que te diviertas!

Si sabe que recibe números enteros, podría usar:

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

Aquí hay una muestra de trabajo de NSNumberFormatter leyendo el número localizado NSString (xCode 3.2.4, osX 10.6), para ahorrarles a otros las horas que acabo de pasar haciendo el tonto. Cuidado: si bien puede manejar espacios en blanco al final (“8,765.4” funciona), no puede manejar el espacio en blanco inicial y esto no puede manejar caracteres de texto extraviados. (Malos hilos de entrada: “8” y “8q” y “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 

Yo quería convertir una cadena a un doble. Esta respuesta anterior no funcionó para mí. Pero esto hizo: ¿Cómo hacer conversiones de cadenas en Objective-C?

Todo lo que hice fue:

 double myDouble = [myString doubleValue]; 

¡Gracias a todos! Soy un feedback combinado y finalmente logro convertir de entrada de texto (cadena) a Entero. Además, podría decirme si la entrada es entera 🙂

 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]; 

Creo que NSDecimalNumber lo hará:

Ejemplo:

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

NSDecimalNumber es una subclase de NSNumber, por lo que se permite la conversión implícita.

¿Qué pasa con el atoi estándar de atoi ?

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

¿Crees que hay alguna advertencia?

Puedes usar [string intValue] o [string floatValue] o [string doubleValue] etc.

También puede usar la clase NSNumberFormatter :

también puedes hacer como este código 8.3.3 ios 10.3 support

 [NSNumber numberWithInt:[@"put your string here" intValue]] 
 NSDecimalNumber *myNumber = [NSDecimalNumber decimalNumberWithString:@"123.45"]; NSLog(@"My Number : %@",myNumber); 

Trabajó en Swift 3

 NSDecimalNumber(string: "Your string") 

Sé que esto es muy tarde, pero el código siguiente funciona para mí.

Prueba este código

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

Esto puede ayudarte. Gracias

Prueba esto

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

Nota: he utilizado longLongValue según mi requisito. También puede usar integerValue, longValue o cualquier otro formato según sus requisitos.

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