objective-c nsstring nsnumber primitive-types

objective c - Cómo convertir un NSString en un NSNumber



objective-c primitive-types (18)

¿Cómo puedo convertir una NSString contenga un número de cualquier tipo 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 de si esto funciona con algún 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.


C objetivo

(Nota: este método no funciona bien con las diferentes configuraciones regionales, pero es un poco 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 forma de la extensión Esto es mejor, en realidad, porque funcionará bien con los locales y los 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


¡Gracias a todos! Soy retroalimentación combinada 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];


¿Qué hay del atoi estándar de atoi ?

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

¿Crees que hay alguna advertencia?


Aquí hay una muestra de trabajo de NSNumberFormatter que lee el número localizado NSString (xCode 3.2.4, osX 10.6), para ahorrar a otros las horas que acabo de pasar. Cuidado: aunque puede manejar espacios en blanco finales ("8,765.4" funciona), esto no puede manejar los espacios en blanco iniciales y esto no puede manejar caracteres de texto extraviados. (Cadenas de entrada incorrectas: "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


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.


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

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


Prueba esto

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

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


Puede usar -[NSString integerValue] , -[NSString floatValue] , etc. Sin embargo, la forma correcta (sensible al entorno local, etc.) es usar -[NSNumberFormatter numberFromString:] que le dará un NSN number convertido de la configuración regional apropiada y dadas las configuraciones de NSNumberFormatter (incluso si permitirá valores de punto flotante).



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

Prueba este codigo

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

Esto puede ayudarte. Gracias


Si sabes que recibes enteros, puedes usar:

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


Solo puede usar [string intValue] o [string floatValue] o [string doubleValue] etc.

También puede utilizar la clase NSNumberFormatter :


También puedes hacer como este código 8.3.3. Soporte para iOS 10.3.

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


También puedes hacer esto:

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

¡Que te diviertas!


Trabajó en Swift 3

NSDecimalNumber(string: "Your string")


Utilice 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, mi número será nil . Si es un número válido, ahora tiene toda la bondad de NSNumber para determinar qué tipo de número es realmente.


NSDecimalNumber *myNumber = [NSDecimalNumber decimalNumberWithString:@"123.45"]; NSLog(@"My Number : %@",myNumber);


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