PDA

Visualizza la versione completa : [objective-c] String to double/Float


francescocorr
30-04-2012, 21:38
Salve a tutti, ho un problema su dei numeri.
Faccio una query sul db e recupero dei float dalla tabella che mi interessa.
Li passo dove mi servono in questo modo:



NSMutableDictionary *dictionary;
dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:costo_1,@"costo_1",costo_2,@"costo_2", nil];
[listaTemp addObject:dictionary];
[dictionary release];


Nella vista dove devo andare a fare i calcoli mi richiamo il metodo, recupero l'array e stampo



NSString *costo = [dictionary objectForKey:@"costo_1"];
double c_1 = [costo doubleValue];
NSLog(@"COSTO_1 DA DB______%f", c_1);


La query mi recupera correttamente il valore e stampandolo ad esempio 3.5

Invece quando stampo c_1 mi da 0,00000
Purtroppo questi valori mi servono per poter fare un calcolo.
Dove sbaglio?
Qualcuno mi da una mano?
Grazie

Who am I
30-04-2012, 23:04
La query mi recupera correttamente il valore e stampandolo ad esempio 3.5


Di che valore parli (intendo il nome della variabile)?
Se doubleValue invocato su costo restituisce 0.0 significa che non contiene un double.Prova a stampare costo e dimmi qual' l' output.
Poi se fai vedere il programma completo meglio.

francescocorr
30-04-2012, 23:59
Ciao e grazie per la risposta.

Allora il valore il valore del campo e se lo stampo come stringa dopo recuperato mi stampa 3,50.

Se lo stampo come stringa dopo passato alla vista mi stampa sempre 3,50.

Il problema quando lo converto in double.

Penso che il codice che ho postato basti a capire comunque qui c' il resto del codice





while ( sqlite3_step(selectstm) == SQLITE_ROW) {
costo_singolo_capo = [NSString stringWithUTF8String:(char *) sqlite3_column_text(selectstm, 0)];
costo_capo_multiplo = [NSString stringWithUTF8String:(char *) sqlite3_column_text(selectstm, 1)];
tipo_capo = [NSString stringWithUTF8String:(char *) sqlite3_column_text(selectstm, 2)];
dictionary = [[NSMutableDictionary alloc] initWithObjectsAndKeys:costo_singolo_capo, @"costo_singolo_capo", costo_capo_multiplo, @"costo_capo_multiplo", tipo_capo, @"tipo_capo", nil];
[listaTemp addObject:dictionary];
[dictionary release];


Quindi facendo la query come dicevo prima recupero i campi dal db. i primi due sono prezzi e quindi float/double con precisione doppia.
Invece il terzo stringa.

Adesso passo questi valori alla vista dove effettuo i calcoli e li prelevo facendo:



// qui c' la chiamata al metodo che poi mi restituisce l'array di cui sotto....

NSMutableDictionary *dictionary = [data objectAtIndex:0];
NSString *tipoCapo = [tariffadictionary objectForKey:@"tipo_capo"]];
NSString *capoSingolo = [tariffadictionary objectForKey:@"costo_singolo_capo"]];
NSString *capoMulti = [tariffadictionary objectForKey:@"costo_capo_multiplo"]];


Logicamente se stampo il costo qui essendo una stringa me lo stampa correttamente.
Invece se adesso converto la stringa in float con questa istruzione:



float c1 = [capoSingolo floatValue];
float c2 = [capoMulti floatValue];


Se stampo i due float mi vengono 0,000000

Spero di essermi spiegato meglio

Fank

Who am I
01-05-2012, 14:50
Prova a convertirla senza il metodo doubleValue ne floatValue:



char* str=[costo UTF8String];
NSLog(@"%f",atof(str) );


Cosa ti stampa? :spy:

Caiodark
01-05-2012, 17:42
Mmmm, bisogna capire se la conversione viene localizzata (separatore decimale ,) oppure no (separatore decimale .).

francescocorr
01-05-2012, 19:18
Originariamente inviato da Who am I
Prova a convertirla senza il metodo doubleValue ne floatValue:



char* str=[costo UTF8String];
NSLog(@"%f",atof(str) );


Cosa ti stampa? :spy:


Allora vi scrivo qui la stampa sia delle stringhe sia col metodo propostomi.

COSTO1 STRINGA_________ 0,05
COSTO2 STRINGA________4,50

Valori Stampati come indicatomi da te sopra.

COSTO 1 Non stringa________0.000000
COSTO 2 Non stringa________4.000000


Nel DB il valore scritto con la virgola tipo 4,50

PS il risultato della stampa lo stesso che ottengo io anche forzando il valore come float o come double.

Grazie per l'aiuto
Frank

Who am I
01-05-2012, 19:40
Allora proprio come diceva Caiodark, devi sostituire la virgola col punto:



NSString *costo = [dictionary objectForKey:@"costo_1"];
NSString* temp;
temp=[costo stringByReplacingOccurrencesOfString:@"," withString:@"." options:0 range: NSMakeRange(0, [costo length])];
double c_1 = [temp doubleValue];
NSLog(@"%f",c_1);

francescocorr
01-05-2012, 19:56
Ok sembra funzionare bene :)
Ho fatto anche un'operazione e sembra tutto ok.
Qual' il problema? Il valore del database?
Grazie per l'aiuto

Who am I
01-05-2012, 20:58
Evidentemente il database memorizza il valore utilizzando il formato con la virgola.

Loading