阅读文档,我必须做一些丑陋的事情:
NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale];
但是:有没有更好的方法告诉NSDecimalNumber类要注意句点(。)而不是其他任何东西? Locales对我来说太不安全了。如果有一天新总统认为将期限符号从。更改为,,会怎么样?然后我的应用程序崩溃了。当然这不太可能发生。但它有可能。足以让我使用语言环境来吓唬我; - )
有什么想法吗?或者这是我唯一的选择?如果这是唯一的选择:上述方法是否正确?还是有更好的一个?
并且:如果我做对了,NSDecimalNumber对象将读取该字符串,解析它并创建其中的尾数,指数和isNegative值以供内部使用,对吧?
编辑:我应该提到我以编程方式/手动(在我的代码中)添加这些值,它们不是用户输入。
答案 0 :(得分:2)
仅当您传入的字符串不是默认语言环境中的有效十进制数时,才需要指定语言环境。如果您的用户正在创建字符串,那么他们很可能会为他们正在使用的语言环境正确格式化它们。
使用区域设置比不使用它们更安全。试图解析“。”超出“1,50”的可能性不大。
并考虑到
[NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale]
在文档中描述为
创建并返回NSDecimalNumber 值等于的对象 在给定的数字字符串中。
我认为可以肯定的是,它创建并返回一个NSDecimalNumber,其值等于字符串的值。
答案 1 :(得分:1)
区域设置是一件好事;如果总统要将小数点从.
更改为,
,则en_US
语言环境将在操作系统的下一个版本中更新 - 您没有明确提及语言环境的小数在上面的代码中指出,所以你没关系。话虽如此,您可能希望获得系统区域设置,而不是明确指定en_US
,这在美国以外的任何地方都是错误的。
如果你担心字符串,它应该来自用户,在这种情况下,他们将使用他们的特定于语言环境的小数点,这应该匹配。如果你试图以这种方式初始化NSDecimalNumber
,我认为你可以,但我想可以有更容易的方法去捕捉那只猫。
是的,如果你做对了,结果将是一个NSDecimalNumber对象,其值等于你传入的字符串。
答案 2 :(得分:0)
区域设置是一件好事。应用于静态内部数据的可变区域设置是一件糟糕的事情,你是对(如果可能是偏执的:D)关注将区域设置应用于您(而不是用户)提供的数据。以下是一些不依赖于将区域设置应用于内部数据的解决方案。
number = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:-5 isNegative:NO];
number = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:0.00001] decimalValue];
第二个很容易变成实现-decimalNumberWithDouble:
的NSDecimalNumber类别。可能非常有用。