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中,它看起来像使用的值NSUserDefaults
(通过快速浏览其代码)结束。
做一些实验,我发现,有下列情形的影响默认解析行为,据我可以告诉:
- 在
NSUserDefaults
NSDecimalSeparator
。
AppleLocale
in NSUserDefaults
。
NSLocaleCode
in NSUserDefaults
。
- 设置的值为
CFBundleDevelopmentRegion
。
- 环境的
LANG
/LC_ALL
/etc ...值。
+[NSLocale systemLocale]
。
而且显然它不是+[NSLocale currentLocale]
,因为此问题源于当前语言环境无效的事实。
问题不在于打印,而在于解析。 _“第一个是使用默认数字格式区域设置(en_US)来解析”_ - 我的问题是为什么当我的当前区域设置为fr_FR时,en_US是默认值。因此,当文档说缺省语言环境依赖时,如果不是当我的当前语言环境是fr_FR时它与en_US有什么不同? – thejaz 2013-03-21 05:40:35
该文档没有说明是什么导致语言环境成为“默认”语言环境,尽管它确实使它看起来像可以更改。我最初的想法是它可能与CFBundleDevelopmentRegion的值设置有关[“通常对应于作者的本地语言”](https://developer.apple.com/library/ios/#documentation/General/Reference /InfoPlistKeyReference/Articles/CoreFoundationKeys.html),但更改该值似乎没有影响任何行为。如果API或文档不清楚,最好的做法是[提供雷达](https://bugreport.apple.com)。 – frozendevil 2013-03-21 07:39:11
我已经提交了文档雷达,我鼓励您复制(rdar:// 13520160,http://openradar.appspot.com/radar?id = 2878409);我还为我的答案增加了更多信息。 – frozendevil 2013-03-27 21:52:46