在Objective-C中将字符串转换为浮点数

5

我有一个解析器返回一些字符串值,我想将其用作类实例初始化的参数。

我有一个方法需要两个NSString和一个float值,但我无法将字符串转换为浮点数,以下是我的代码:

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

在 .h 文件中

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

但我无法将字符串转换为浮点数 - 这里的字符串是指NSString还是C字符串? - Mahesh
顺便提一下,如果你正在做货币转换器,你可能会对这个感兴趣:https://github.com/davedelong/DDUnitConverter 它有一个从IMF获取数据的货币转换器。 - Dave DeLong
2
请注意,在处理货币时,您真的非常想避免使用浮点数。浮点数在不能准确表示或计算相对较小的值方面具有显著的能力。双精度浮点数要好得多。 - bbum
3个回答

19
不,不,不,不,不,不,不,不,不。
使用NSNumberFormatter。这就是它存在的原因。 -floatValue-doubleValue只是临时的快捷方法,但它们在某些情况下容易出错。例如:
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 方法无法区分合法数字(@"0")和非法数字(@"abc")。
另一方面,NSNumberFormatter 如果无法解析字符串,将返回 nil;如果可以,它将返回一个 NSNumber。此外,它还考虑货币符号、区域特定的小数和千位分隔符以及用户的语言环境等因素。而-floatValue 和类似方法则不会考虑这些因素。
有关更多信息,请参见相关问题:如何将 NSString 转换为 NSNumber

1
呵呵,你回答了我脑海中另一个问题。 - Hack Saw

7
float f = [yourStringObject floatValue];

1

尝试:

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

此外,传递NSNumber*而不是float将无法得到您期望的结果。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接