String to float in objective c

17,458

Solution 1

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

Solution 2

float f = [yourStringObject floatValue];

Solution 3

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.

Share:
17,458
Michele
Author by

Michele

Updated on July 05, 2022

Comments

  • Michele
    Michele over 1 year

    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_;
    
  • Hack Saw
    Hack Saw almost 13 years
    Hehe, you answered another question I had floating around in my head.