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

2019-08-17 19:16发布

根据该文件, [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还是我做错了)

Answer 1:

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的它看起来像它结束了使用的价值NSDecimalSeparatorNSUserDefaults (从他们的代码快速浏览)。

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

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

很显然它不是+[NSLocale currentLocale]因为这个问题从当前的语言环境没有影响的事实造成的。



文章来源: NSDecimalNumber decimalNumberWithString: ignores current locale