将十进制数作为字符串输入NSDecimalNumber的简便方法?

时间:2009-08-26 16:25:50

标签: iphone cocoa uikit touch

阅读文档,我必须做一些丑陋的事情:

NSLocale *usLocale = [[[NSLocale alloc] initWithLocaleIdentifier:@"en_US"] autorelease];
NSDecimalNumber *number = [NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale];

但是:有没有更好的方法告诉NSDecimalNumber类要注意句点(。)而不是其他任何东西? Locales对我来说太不安全了。如果有一天新总统认为将期限符号从更改为,会怎么样?然后我的应用程序崩溃了。当然这不太可能发生。但它有可能。足以让我使用语言环境来吓唬我; - )

有什么想法吗?或者这是我唯一的选择?如果这是唯一的选择:上述方法是否正确?还是有更好的一个?

并且:如果我做对了,NSDecimalNumber对象将读取该字符串,解析它并创建其中的尾数,指数和isNegative值以供内部使用,对吧?

编辑:我应该提到我以编程方式/手动(在我的代码中)添加这些值,它们不是用户输入。

3 个答案:

答案 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类别。可能非常有用。