2011-01-28 10 views
5

Tengo un analizador que devuelve un valor de cadena que me gustaría usar como parámetro para la inicialización de mi instancia de clase.Cadena para flotar en el objetivo c

tengo un método que pide dos NSString y un valor de coma flotante, pero no puede convertir la cadena a flotar, aquí está mi código:

NSString *from = [[NSString alloc] initWithString:@"EUR"]; 
    NSString *to = [[NSString alloc] initWithString:[attributeDict objectForKey:@"currency"]]; 
    NSNumber *rate = [[NSNumber alloc] initWithFloat:[[attributeDict objectForKey:@"rate"] doubleValue]]; 


    currency = [[Currency init] alloc]; 
    [currency addCurrencyWithFrom:from andTo:to andRate:rate]; 

en el .h

- (id) addCurrencyWithFrom: (NSString *) from_ andTo:(NSString *) to_ andRate:(float *) float_; 
+0

'pero no puede convertir la cadena en float' - ¿Quiere decir que aquí la cadena es NSString o una cadena de C? – Mahesh

+0

Como nota al margen, si está utilizando un conversor de divisas, puede que le interese retirar: https://github.com/davedelong/DDUnitConverter Tiene un convertidor de divisas que extrae datos del FMI. –

+2

Tenga en cuenta también que realmente querrá evitar flotadores al hacer cualquier cosa con la moneda. Los flotadores son notables en su capacidad para no poder representar o calcular con precisión valores relativamente pequeños. Los dobles son significativamente mejores. – bbum

Respuesta

18

No no no no no no no no no.

Usa un NSNumberFormatter. Es por eso que existe. -floatValue y -doubleValue son solo correcciones temporales rápidas y fáciles, pero fallan de malas maneras. Por ejemplo:

NSLog(@"%f", [@"123" floatValue]); //logs 123.0000 
NSLog(@"%f", [@"abc" floatValue]); //logs 0.0000 
NSLog(@"%f", [@"0" floatValue]); //logs 0.0000 
NSLog(@"%f", [@"42" floatValue]); //logs 42.0000 
NSLog(@"%f", [@"42x" floatValue]); //logs 42.0000 

-floatValue es incapaz de distinguir entre un número apropiado (@"0") y otra inválida (@"abc").

NSNumberFormatter, por otro lado, le dará nil si no puede analizarlo, y NSNumber si puede. También toma en cuenta elementos como símbolos de moneda, separadores de miles y decimales específicos de la región y la configuración regional del usuario. -floatValue y amigos no.

Ver esta pregunta relacionada Para obtener más información: How to convert an NSString into an NSNumber

+1

Hehe, respondiste a otra pregunta que tenía flotando en mi cabeza. –

7
float f = [yourStringObject floatValue]; 
1

Probar:

double f = [from_ doubleValue]; 
double t = [to_ doubleValue]; 

Además, el paso de una N SNumber * en lugar de un flotador no le dará los resultados que está esperando.