String to float in objective c
Asked Answered
B

3

5

I have a parser returning some string value I'd like to use as parameter for my class instance initialisation.

I have a method asking two NSString and a float value, but I can't convert the string to float, here is my code:

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

in the .h

- (id) addCurrencyWithFrom: (NSString *) from_ andTo:(NSString *) to_ andRate:(float *) float_;
Baffle answered 28/1, 2011 at 17:26 Comment(3)
but I can't convert the string to float - Do you mean here the string is NSString or a C String ?Matthewmatthews
As a side note, if you're doing a currency converter, you might be interested in checking out: github.com/davedelong/DDUnitConverter It has a currency converter that pulls data from the IMF.Constantan
Note also that you'll really really want to avoid floats when doing anything with currency. Floats are remarkable in their ability to not be able to accurately represent or compute relatively small values. Doubles are significantly better.Nessim
C
19

No no no no no no no no no.

Use an NSNumberFormatter. This is why it exists. -floatValue and -doubleValue are merely quick-and-easy temporary fixes, but they fail in bad ways. For example:

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 is unable to distinguish between a proper number (@"0") and an invalid one (@"abc").

NSNumberFormatter, on the other hand, will give you nil if it can't parse it, and an NSNumber if it can. It also takes things like currency symbols, region-specific decimal and thousands separators, and the user's locale into account. -floatValue and friends do not.

See this related question for more info: How to convert an NSString into an NSNumber

Constantan answered 28/1, 2011 at 17:58 Comment(1)
Hehe, you answered another question I had floating around in my head.Berwick
D
7
float f = [yourStringObject floatValue];
Dockhand answered 28/1, 2011 at 17:31 Comment(0)
B
1

Try:

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

Also, passing an NSNumber* instead of a float will not give you the results that you are expecting.

Bottleneck answered 28/1, 2011 at 17:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.