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

4 iphone cocoa-touch uikit

我遇到了麻烦

+ (NSDecimalNumber *)decimalNumberWithString:(NSString *)numericString locale:(NSDictionary *)locale
Run Code Online (Sandbox Code Playgroud)

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

所以文档说得很加密:

参数:... locale定义用于解释numericString中的数字的语言环境(特别是NSDecimalSeparator)的字典.

讨论locale参数确定NSDecimalSeparator是一个句点(例如,在美国使用)还是逗号(例如,在法国使用).

好吧,在文档中搜索NSDecimalSeparator后,没有找到任何内容.在网上搜索,发现这个东西是"弃用的".所以目前我做的事情是这样的:

NSLocale *usLoc = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
NSDecimalNumber *num = [NSDecimalNumber decimalNumberWithString:str locale:usLoc];
Run Code Online (Sandbox Code Playgroud)

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

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

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

Jos*_*man 5

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

NSLocale响应objectForKey:消息,这是使用的相同消息NSDictionary; 这就是为什么你可以使用NSLocale即使方法调用的原因NSDictionary.因为NSDecimalNumber很可能只会查看一个值,NSDecimalSeparator所以我有一种感觉,你可以通过创建一个NSDictionary带有该键的对象并将其作为locale参数传递,但这可能会在将来中断,因为NSDecimalNumber需要一个完整的NSLocale实例和可能会更改为检查其他键.

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

NSLocale *us = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US"];
Run Code Online (Sandbox Code Playgroud)

小数分隔符肯定是.每次都有.