2013-03-20 47 views
9

根据文档,[NSDecimalNumber decimalNumberWithString:]应该使用的区域设置小数分隔: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还是我做错了什么)

回答

6

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

,如果你只是想用当前的语言环境。

总结:

  1. NSDecimalNumber只是存储。记录它并不反映任何有关语言环境的内容。
  2. 为了让NSDecimalNumber正确存储一个数字,它的语言环境需要与预期输入的语言环境相匹配(-[NSLocale currentLocale]在这里是个不错的选择)。
  3. 为了显示给定语言环境正确格式的数字,请使用NSNumberFormatter。

编辑:

好吧,我已经做了这方面的一些更多的研究。

在GNUStep中,它看起来像使用的值NSUserDefaults(通过快速浏览其代码)结束。

做一些实验,我发现,有下列情形的影响默认解析行为,据我可以告诉:

  1. NSUserDefaultsNSDecimalSeparator
  2. AppleLocale in NSUserDefaults
  3. NSLocaleCode in NSUserDefaults
  4. 设置的值为CFBundleDevelopmentRegion
  5. 环境的LANG/LC_ALL/etc ...值。
  6. +[NSLocale systemLocale]

而且显然它不是+[NSLocale currentLocale],因为此问题源于当前语言环境无效的事实。

+1

问题不在于打印,而在于解析。 _“第一个是使用默认数字格式区域设置(en_US)来解析”_ - 我的问题是为什么当我的当前区域设置为fr_FR时,en_US是默认值。因此,当文档说缺省语言环境依赖时,如果不是当我的当前语言环境是fr_FR时它与en_US有什么不同? – thejaz 2013-03-21 05:40:35

+0

该文档没有说明是什么导致语言环境成为“默认”语言环境,尽管它确实使它看起来像可以更改。我最初的想法是它可能与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

+0

我已经提交了文档雷达,我鼓励您复制(rdar:// 13520160,http://openradar.appspot.com/radar?id = 2878409);我还为我的答案增加了更多信息。 – frozendevil 2013-03-27 21:52:46