1

阅读文档,我将不得不做一些像这样丑陋的事情:

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

但是:难道没有更好的方法告诉 NSDecimalNumber 类注意句点 (.) 而不是其他任何东西?语言环境对我来说很不安全。如果有一天一位新总统认为更改时期符号很酷怎么办, ? 然后我的应用程序崩溃了。当然,这种情况发生的可能性不大。但是有一点机会可以。为此使用语言环境足以吓到我;-)

任何想法?还是这是我唯一的选择?如果这是唯一的选择:上述方法是否正确?还是有更好的?

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

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

4

3 回答 3

2

仅当您传入的字符串在默认语言环境中不是有效的十进制数时,才需要指定语言环境。如果您的用户正在创建字符串,他们很可能会根据他们使用的区域设置正确地格式化它们。

使用语言环境比不使用它们要安全得多。试图解析“。” 出“1,50”的可能性不大。

考虑到这一点

[NSDecimalNumber decimalNumberWithString:@"0.00001" locale:usLocale]

在文档中描述为

创建并返回一个 NSDecimalNumber 对象,其值等于给定数字字符串中的值。

我认为它创建并返回一个值等于字符串值的 NSDecimalNumber 是一个安全的赌注。

于 2009-08-26T16:47:17.030 回答
1

语言环境是件好事;如果总统将小数点从 更改.,,则en_US语言环境将在操作系统的下一个版本中更新——您没有在上面的代码中明确提及语言环境的小数点,所以你可以在那里。话虽如此,您可能想要获取系统区域设置而不是en_US明确指定,这在美国以外的任何地方都是错误的。

如果您担心字符串,它应该来自用户,在这种情况下,他们将使用其特定于区域设置的小数点,这应该匹配。如果您尝试以NSDecimalNumber这种方式初始化,我想您可以,但我想有更简单的方法可以给那只猫剥皮。

是的,如果你做对了,结果将是一个 NSDecimalNumber 对象,其值等于你传入的字符串。

于 2009-08-26T16:33:44.403 回答
0

语言环境是件好事。应用于静态内部数据的可变区域设置是一件坏事,您是正确的(如果可能是偏执狂:D)担心将区域设置应用于您(而不是用户)提供的数据。以下是一些不依赖于将语言环境应用于您的内部数据的解决方案。

number = [NSDecimalNumber decimalNumberWithMantissa:1 exponent:-5 isNegative:NO];
number = [NSDecimalNumber decimalNumberWithDecimal:[[NSNumber numberWithDouble:0.00001] decimalValue];

第二个很容易变成 NSDecimalNumber 类别实现-decimalNumberWithDouble:。应该很有用。

于 2009-08-26T16:49:43.123 回答