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。
Edit:
好的,我对此做了更多研究。
在 GNUStep 中,看起来它最终使用了值NSDecimalSeparator
in NSUserDefaults
(快速浏览他们的代码)。
经过一些实验,据我所知,以下任何一个都不会影响默认的解析行为:
-
NSDecimalSeparator
in NSUserDefaults
.
-
AppleLocale
in NSUserDefaults
.
-
NSLocaleCode
in NSUserDefaults
.
- 设定的值是
CFBundleDevelopmentRegion
.
- 环境的
LANG
/LC_ALL
/等等...值。
-
+[NSLocale systemLocale]
.
显然不是+[NSLocale currentLocale]
,因为这个问题源于当前区域设置没有效果的事实。