根据文档,[NSDecimalNumber decimalNumberWithString:]应该使用语言环境小数点分隔符:



但是,当我尝试时,此代码:

NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1"]);
NSLog(@"%@", [NSDecimalNumber decimalNumberWithString:@"100,1" locale:NSLocale.currentLocale]);

给...
100
100.1

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

输出不应该相同吗?

(我知道我可以使用[NSDecimalNumber decimalNumberWithString:locale:]来强制执行该行为,因此,此问题不是要找到替代方法,即使这是一个错误或我做错了什么)

最佳答案

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只是存储。记录它不会反射(reflect)任何有关语言环境的信息。
  • 为了使NSDecimalNumber正确存储数字,其语言环境需要匹配预期输入的语言环境(在这里-[NSLocale currentLocale]是一个不错的选择)。
  • 为了显示给定语言环境正确格式化的数字,请使用NSNumberFormatter。


  • 编辑:

    好的,我对此进行了更多研究。

    在GNUStep中,看起来它最终使用了NSDecimalSeparatorNSUserDefaults的值(通过快速浏览其代码)。

    通过做一些实验,我发现以下所有内容都不会影响默认的解析行为:
    NSDecimalSeparator中的
  • NSUserDefaults
  • AppleLocale中的
  • NSUserDefaults
  • NSLocaleCode中的
  • NSUserDefaults
  • CFBundleDevelopmentRegion设置的值。
  • 环境的LANG/LC_ALL/etc ...值。
  • +[NSLocale systemLocale]

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

    关于ios - NSDecimalNumber decimalNumberWithString : ignores current locale,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15534431/

    10-12 20:52