根据文档,[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]);
如果您只想使用当前语言环境。
总之:
-[NSLocale currentLocale]
是一个不错的选择)。 编辑:
好的,我对此进行了更多研究。
在GNUStep中,看起来它最终使用了
NSDecimalSeparator
中NSUserDefaults
的值(通过快速浏览其代码)。通过做一些实验,我发现以下所有内容都不会影响默认的解析行为:
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/