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)
如果您只想使用当前的语言环境.
综上所述:
-[NSLocale currentLocale]这里是一个不错的选择).编辑:
好的,我已经对此做了更多的研究.
在GNUStep中,它看起来最终使用NSDecimalSeparatorin 的值NSUserDefaults(从快速浏览它们的代码).
做一些实验我发现以下任何一个都不会影响默认的解析行为,据我所知:
NSDecimalSeparator在NSUserDefaults.AppleLocale在NSUserDefaults.NSLocaleCode在NSUserDefaults.CFBundleDevelopmentRegion.LANG/ LC_ALL/ etc ...值.+[NSLocale systemLocale].显然它不是+[NSLocale currentLocale],因为这个问题源于当前的语言环境没有效果.
| 归档时间: |
|
| 查看次数: |
4278 次 |
| 最近记录: |