根据该文件, [NSDecimalNumber decimalNumberWithString:]
应该使用的区域设置小数分隔:
无论NSDecimalSeparator是一个时间段(如被使用,例如,在美国)或逗号(如被使用,例如,在法国)取决于默认的语言环境。
但是,当我尝试一下,这样的代码:
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]);
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]);
给...
100
100.1
......因为双方的iOS 5和iOS 6的输出我已经与瑞典和法国试图为区域设置为这两个国家使用逗号(,)作为小数点分隔符。
如果不是输出是一样的吗?
(我知道我可以使用[NSDecimalNumber decimalNumberWithString:区域:]给力的行为,所以这个问题不是寻找替代方案,只是如果这是bug还是我做错了)
NSDecimalNumber是简单地对数型数据的存储类。 它运行在你通过它来创建其数字字符串解析器(NSNumberFormatter)。 你的第二个日志语句作品“更好”的原因是因为第一个是使用默认的数字格式的语言环境(它看起来像它的EN_US,但我无法验证这一点, 可以看到修改的打击了解更多信息 。)来解析,并“100,1”不是一个有效的电话号码,以便“非数字”的一部分被剥离。 通过指定使用“”十进制分隔它的正确捕获完整的数字语言环境。
当你的NSLog()的NSDecimalNumber它简单地调用-description
,它没有场所背景并可以打印,或多或少,为所欲为。
如果你想打印格式正确的号码使用NSNumberFormatter像这样:
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];
NSLog(@"%@", number);
NSNumberFormatter *formatter = [[NSNumberFormatter alloc] init];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
NSLocale *locale = [[NSLocale alloc] initWithLocaleIdentifier:@"fr_FR"];
[formatter setLocale:locale];
NSLog(@"%@", [formatter stringFromNumber:number]);
或者,简单
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];
NSLog(@"%@", [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterDecimalStyle]);
如果你只是想用当前的语言环境。
综上所述:
- NSDecimalNumber只是存储。 记录它不反映对区域设置任何东西。
- 为了获得NSDecimalNumber妥善存放了一些,它的区域需要符合预期的输入的语言环境(
-[NSLocale currentLocale]
是一个很好的选择在这里)。 - 为了显示给定的区域设置格式正确号码,使用NSNumberFormatter。
编辑:
好吧,我已经做了这方面的一些更多的研究。
在GNUstep的它看起来像它结束了使用的价值NSDecimalSeparator
在NSUserDefaults
(从他们的代码快速浏览)。
做了一些实验,我发现,有下列情形的影响默认解析行为,据我可以告诉:
-
NSDecimalSeparator
在NSUserDefaults
。 -
AppleLocale
在NSUserDefaults
。 -
NSLocaleCode
在NSUserDefaults
。 - 对于设置的值
CFBundleDevelopmentRegion
。 - 环境的
LANG
/ LC_ALL
的/ etc ...值。 -
+[NSLocale systemLocale]
。
很显然它不是+[NSLocale currentLocale]
因为这个问题从当前的语言环境没有影响的事实造成的。