gpt4 book ai didi

objective-c - NSNumberFormatter,NSDecimalNumber和科学计数法

转载 作者:行者123 更新时间:2023-12-01 18:27:52 26 4
gpt4 key购买 nike

我与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,这样它就不会伪造结果,并且在必要时使用指数表示法。

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

最佳答案

您不能只是将NSNumber转换为NSDecimalNumber并期望它能工作。如果您的电话号码不太复杂,可以抛弃NSNumberFormatter并尝试使用它:

NSDecimalNumber* number = [NSDecimalNumber decimalNumberWithString:text];

这将为您提供一个实际的 NSDecimalNumber实例及其精度。

不幸的是, setGeneratesDecimalNumbers:无法正常工作。这是 known bug
如果您的电话号码太复杂而无法使用 decimalNumberWithString:,那么您可能不满意Apple的API。您唯一的选择是手动将字符串解析为 NSDecimalNumber可以理解的内容,或者对 NSNumberFormatter提供给您的不精确值进行一些后处理。

最后,如果您真的想要科学计数法中的数字,为什么不使用刚才使用的数字格式器呢?只需调用 stringFromNumber:即可获取格式值。

关于objective-c - NSNumberFormatter,NSDecimalNumber和科学计数法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11712391/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com