要传递给NSDecimalNumber + decimalNumberWithString的语言环境参数:locale:所以它总是与NSString一起使用点(.)十进制标记?

Dav*_*her 7 macos cocoa nsstring nsdecimalnumber nslocale

我有一个NSString,我想转换成一个NSDecimalNumber.该字符串是从服务器接收的,并且始终使用en_US类似于XXX.YYY或不相似的语言环境进行格式化XXX,YYY.我想创建一个NSDecimalNumber接受XXX.YYY用户无论语言环境如何.该数字永远不会显示给用户,它用于进行内部数学运算.

通常你会做这样的事情:

NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234"];
Run Code Online (Sandbox Code Playgroud)

但是,如果用户正在运行fr_FRMac OS X 的区域设置,则会中断.en_US将其解释为一点二三四,其中 - fr_FR将其解释为一千二百三十四,两者都是非常不同的数字.

显而易见的解决方案是使用+decimalNumberWithString:locale:.但是我不确定将该locale:参数作为参数传递给所有国际版本的Mac OS X.我最好的猜测是这样做:

NSLocale        *l = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
Run Code Online (Sandbox Code Playgroud)

这是最好的方法吗,安全吗?@"en_US"是否可以在所有国际版本的Mac OS X上使用本地标识符,或者nil在某些情况下是否可以返回NSLocale?


更新1:这似乎运作良好,更明确:

NSDictionary    *l = [NSDictionary dictionaryWithObject:@"." forKey:NSLocaleDecimalSeparator];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
Run Code Online (Sandbox Code Playgroud)

NSLocaleDecimalSeparator是一个为NSLocale定义的常量,它响应-objectWithKey:,就像NSDictionary一样.你可以提供你想要的任何小数点分隔符,比如@",".

我认为这可能是问题的最佳答案,除非其他人有更好的想法?

Dav*_*her 7

这似乎运作良好,更明确:

NSDictionary    *l = [NSDictionary dictionaryWithObject:@"." forKey:NSLocaleDecimalSeparator];
NSDecimalNumber *n = [NSDecimalNumber decimalNumberWithString:@"1.234" locale:l];
Run Code Online (Sandbox Code Playgroud)

NSLocaleDecimalSeparator是一个为NSLocale定义的常量,它响应-objectWithKey:,就像NSDictionary一样.你可以提供你想要的任何小数点分隔符,比如@",".

我认为这可能是问题的最佳答案,除非其他人有更好的想法?