2011-01-28 19 views
5

Ho un parser che restituisce un valore di stringa che vorrei utilizzare come parametro per l'inizializzazione della mia istanza di classe.String to float in ogg c

Ho un metodo che chiede due NSString e un valore float, ma non posso convertire la stringa a stare a galla, qui è il mio codice:

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

nel .h

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

'ma non posso convertire la stringa float' - Vuoi dire che qui la stringa è NSString o una stringa di C? – Mahesh

+0

Come nota a margine, se stai facendo un convertitore di valuta, potresti essere interessato a dare un'occhiata: https://github.com/davedelong/DDUnitConverter Ha un convertitore di valuta che estrae i dati dal FMI. –

+2

Nota anche che vorresti davvero evitare i float quando fai qualcosa con la valuta. I galleggianti sono notevoli nella loro capacità di non essere in grado di rappresentare con precisione o calcolare valori relativamente piccoli. I doppi sono significativamente migliori. – bbum

risposta

18

No no no no no no no no no.

Utilizzare un NSNumberFormatter. Ecco perché esiste. -floatValue e -doubleValue sono solo correzioni temporanee facili e veloci, ma falliscono in modi sbagliati. Ad esempio:

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 è in grado di distinguere tra un numero adeguato (@"0") e uno valido (@"abc").

NSNumberFormatter, d'altra parte, ti darà nil se non può analizzarlo, e un NSNumber se possibile. Inoltre prende in considerazione elementi come simboli di valuta, decimali specifici della regione e separatori di migliaia e le impostazioni locali dell'utente. -floatValue e gli amici no.

Vai a questa domanda correlate Per ulteriori informazioni: How to convert an NSString into an NSNumber

+1

Hehe, hai risposto ad un'altra domanda che avevo in giro nella mia testa. –

7
float f = [yourStringObject floatValue]; 
1

Prova:

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

Inoltre, il superamento di un N SNumber * invece di un float non ti darà i risultati che ti aspetti.