NSDecimalNumber decimalNumberWithString:忽略当前的语言环境

the*_*jaz 10 cocoa-touch objective-c nsdecimalnumber ios

根据文档,[NSDecimalNumber decimalNumberWithString:]应使用locale小数分隔符:

NSDecimalSeparator是句点(例如,在美国使用)还是逗号(例如在法国使用)取决于默认语言环境.

但是当我尝试它时,这段代码:

NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]);
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]);
Run Code Online (Sandbox Code Playgroud)

给...

100
100.1
Run Code Online (Sandbox Code Playgroud)

...作为iOS 5和iOS 6的输出.我尝试使用瑞典语和法语作为区域设置,因为这两个国家都使用逗号(,)作为小数分隔符.

输出应该不一样吗?

(我知道我可以使用[NSDecimalNumber decimalNumberWithString:locale:]来强制行为,所以这个问题不是关于找到替代方案,只是如果这是一个错误或我做错了什么)

小智 7

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]);
Run Code Online (Sandbox Code Playgroud)

或者,简要地说

NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"100.1"];
NSLog(@"%@", [NSNumberFormatter localizedStringFromNumber:number numberStyle:NSNumberFormatterDecimalStyle]);
Run Code Online (Sandbox Code Playgroud)

如果您只想使用当前的语言环境.

综上所述:

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

编辑:

好的,我已经对此做了更多的研究.

在GNUStep中,它看起来最终使用NSDecimalSeparatorin 的值NSUserDefaults(从快速浏览它们的代码).

做一些实验我发现以下任何一个都不会影响默认的解析行为,据我所知:

  1. NSDecimalSeparatorNSUserDefaults.
  2. AppleLocaleNSUserDefaults.
  3. NSLocaleCodeNSUserDefaults.
  4. 为...设置的值CFBundleDevelopmentRegion.
  5. 环境的LANG/ LC_ALL/ etc ...值.
  6. +[NSLocale systemLocale].

显然它不是+[NSLocale currentLocale],因为这个问题源于当前的语言环境没有效果.