1

我与 NSNumberFormatter 发生了严重的争执,即使在阅读了它的大量文档之后,我也无法完全解决我遇到的一个非常简单的问题。我希望你们能帮助我。

我所拥有的:一个NSDecimalNumber表示计算结果,显示在UITextField
我需要的:该结果的科学记数法中。

我在做什么:

-(void)setScientificNotationForTextField:(UITextField*)tf Text:(NSString*)text {

NSString* textBefore = text;

// use scientific notation, i.e. NSNumberFormatterScientificStyle
NSNumberFormatter* formatter = [[NSNumberFormatter alloc] init];
//[formatter setGeneratesDecimalNumbers:YES];
[formatter setNumberStyle:NSNumberFormatterScientificStyle];
NSDecimalNumber* number = (NSDecimalNumber*)[formatter numberFromString:text];
tf.text = [number descriptionWithLocale:[[Utilities sharedUtilities] USLocale]];

NSString* textAfter = tf.text;
// DEBUG
NSLog(@"setScientificNotation | text before = %@, text after = %@", textBefore, textAfter);

[formatter release];
}

会发生什么:
某个结果可能是 0.0099。textBefore将保持正确的值。如果我不告诉格式化程序生成十进制数(在上面的代码段中注释掉),它将从 NSDecimalNumber 创建一个 NSNumber,这会创建一个错误的结果并变成textAfter0.009900000000000001 - 由于 NSNumber 的精度降低而导致舍入错误NSDecimalNumber。
如果我告诉 NumberFormatter 生成小数,它仍然会产生错误的结果。更重要的是,在它插入指数符号(例如“1.23456e-10”)之前,它现在会生成(并因此显示)完整的十进制数,这不是我想要的。
同样,我想让格式化程序使用 NSDecimalNumber 所以它不会


我是否使用错误的课程?我是否误解了文档?有人可以解释为什么会发生这种情况以及如何创建我想要的行为吗?如果我发现任何东西,我当然会继续研究和更新。

4

1 回答 1

4

您不能只将 anNSNumber转换为 anNSDecimalNumber并期望它起作用。如果您的号码不是太复杂,您可以放弃NSNumberFormatter并尝试使用它:

NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString:text];

这将为您提供一个NSDecimalNumber精确的实际实例。

Unfortunately, setGeneratesDecimalNumbers: doesn't work properly. It's a known bug. If your number is too complex to work with decimalNumberWithString:, you're probably out of luck with Apple's APIs. Your only options are either parsing the string manually into something NSDecimalNumber can understand or performing some post-processing on the imprecise value given to you by NSNumberFormatter.

Finally, if you really want a number in scientific notation, why not just use the number formatter you just used? Just call stringFromNumber: to get the formatted value.

于 2012-07-29T20:00:28.200 回答