我与 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,这会创建一个错误的结果并变成textAfter
0.009900000000000001 - 由于 NSNumber 的精度降低而导致舍入错误NSDecimalNumber。
如果我告诉 NumberFormatter 生成小数,它仍然会产生错误的结果。更重要的是,在它插入指数符号(例如“1.23456e-10”)之前,它现在会生成(并因此显示)完整的十进制数,这不是我想要的。
同样,我想让格式化程序使用 NSDecimalNumber 所以它不会
我是否使用错误的课程?我是否误解了文档?有人可以解释为什么会发生这种情况以及如何创建我想要的行为吗?如果我发现任何东西,我当然会继续研究和更新。