我有一个 NSString ,我想将其转换为NSDecimalNumber
. 该字符串是从服务器接收的,并且始终使用en_US
区域设置 likeXXX.YYY
和 not like进行格式化XXX,YYY
。无论用户的语言环境如何,我都想创建一个NSDecimalNumber
接受的。XXX.YYY
该数字永远不会向用户显示,它用于进行内部数学运算。
通常你会做这样的事情:
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234"];
但是,如果用户正在运行fr_FR
Mac OS X 的语言环境,那将会中断。en_US
将其解释为点二三四,其中-asfr_FR
将其解释为一千二百三十四,两者都是非常不同的数字。
显而易见的解决方案是使用+decimalNumberWithString:locale:
. 但我不确定将什么作为参数传递给locale:
适用于所有国际版本的 Mac OS X 的参数。我最好的猜测是这样做:
NSLocale *l = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
这是最好的方法吗,安全吗?本地标识符会@"en_US"
在所有国际版本的 Mac OS X 上可用,还是nil
在某些情况下会返回 NSLocale?
更新1:这似乎运作良好,并且更明确:
NSDictionary *l = [NSDictionary dictionaryWithObject:@"." forKey:NSLocaleDecimalSeparator];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
NSLocaleDecimalSeparator
是为 NSLocale 定义的常量,它响应-objectWithKey:
,就像 NSDictionary 一样。你可以给它任何你想要的小数点分隔符,比如@","
.
我认为这可能是该问题的最佳答案,除非其他人有更好的主意?