如何使用自定义NSDecimalSeparator值创建自定义区域设置?

时间:2009-08-27 11:02:08

标签: iphone cocoa-touch uikit

我遇到了麻烦

+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString locale:(NSDictionary *)locale

因为我想以编程方式提供非常高的精度值,以便最初没有浮点错误,所以apple给了我唯一依赖于不稳定语言环境的选项。

所以文档说得非常加密:

  

参数:......   现场   一本字典   定义语言环境(具体而言   NSDecimalSeparator)用来   解释numericString中的数字。

     

讨论   locale参数确定NSDecimalSeparator是否为   期间(例如,用于   美国)或逗号(按原样)   例如,在法国使用。)

好吧,在文档中搜索NSDecimalSeparator后,没有找到任何内容。在网上搜索,发现这个东西是“弃用的”。所以目前我做了一件危险的事情:

NSLocale *usLoc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:str locale:usLoc];

所以我想知道:如果他们真的需要这个不稳定的语言环境来做这样的事情(我以编程方式添加字符串,没有用户输入),我不能以某种方式创建自己的语言环境?那个参数想要一个NSDictionary,所以想法:

我可以从-initWithLocaleIdentifier:@“en_US”的区域设置字典中创建一个NSMutableDictionary,然后只编辑这个%?&§! NSDecimalSeparator字段?

另一件引起我头痛的事:为什么参数要求NSDictionary,我必须传递一个NSLocale对象?或者我的代码错了? (未经测试,因为我的应用程序目前完全搞砸了;-))

1 个答案:

答案 0 :(得分:5)

似乎没有办法在NSLocale的实例中添加/修改值;您只能获取用户(currentLocaleautoupdatingCurrentLocale)的逻辑区域设置,系统区域设置,而不会由用户在其系统首选项(systemLocale)或任何其他命名中进行任何更改系统知道的语言环境(initWithLocaleIdentifier)。

NSLocale响应objectForKey:消息,该消息与NSDictionary使用的消息相同;这就是为什么你可以使用NSLocale,即使该方法需要NSDictionary。由于NSDecimalNumber可能只会查看一个值NSDecimalSeparator,因此我觉得您可以通过使用该密钥创建NSDictionary对象并将其作为{{1参数,但这可能会在将来中断,因为locale需要一个完整的NSDecimalNumber实例,并且可能会更改为检查其他键。

您是以编程方式创建这些字符串,对吗?因此,您可以控制使用的十进制分隔符。我的建议是使用NSLocale,并获取en_US语言环境:

.

每次小数点分隔符都是NSLocale *us = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];