【问题标题】:NSNumberFormatter iOS big double valueNSNumberFormatter iOS 大双值
【发布时间】:2012-03-10 14:44:50
【问题描述】:

我在格式化大数字时遇到问题。

我首先将一个字符串格式化为一个数字,因为我需要保存一个字符串,所以我从中获取 stringValue:

formatter = [[NSNumberFormatter alloc] init];
[formatter setLocale:[NSLocale currentLocale]];
[formatter setNumberStyle:NSNumberFormatterDecimalStyle];
[formatter setUsesSignificantDigits:NO];
[formatter setMaximumFractionDigits:6];
[formatter setMinimumFractionDigits:0];
[formatter setGroupingSeparator:@""];
value = [formatter numberFromString:textField.text];
label = [value stringValue]

一切正常,即如果我输入 123456745678592.6,我将得到 123456745678592.6。

然后由于语言环境不同,我必须格式化字符串:

numberFormatter = [[NSNumberFormatter alloc] init];
[numberFormatter setLocale:[NSLocale currentLocale]];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setGroupingSeparator:@""];
[numberFormatter setUsesSignificantDigits:NO];
[numberFormatter setMinimumFractionDigits:0];
[numberFormatter setMaximumFractionDigits:6];
tempString = myNumberString;
NSLog(@"number: %@",[NSNumber numberWithDouble:[tempString doubleValue]]);
tempString = [numberFormatter stringFromNumber:[NSNumber numberWithDouble:[tempString doubleValue]]];
NSLog(@"string translated: %@",tempString);

我明白了: “号码:123456745678592.6” "字符串翻译:123456745678593"

当有效数字大于 15 时会发生这种舍入。

假设我输入: 12345674567859.2 然后我得到正确的数字,即 “号码:12345674567859.2” "字符串翻译:12345674567859.2"

与: 12345674567859.23 我得到: “号码:12345674567859.23” "字符串翻译:12345674567859.2"

但有: 1234567456785921 我明白了: “号码:1234567456785921” "字符串翻译:1234567456785920"

这是 nsnumberformatter 的内在限制吗,因为文档没有说明这一点,或者我做错了什么?

【问题讨论】:

    标签: objective-c ios cocoa-touch


    【解决方案1】:

    你能检查一下这个号码的实际类别吗?是NSNumber 还是NSDecimalNumber

    NSNumberdouble 支持,并且不能容纳超过 15 个有效十进制数字。另一方面,NSDecimalNumber 使用十进制算法,最多可容纳 32 位有效数字。

    我已经了解到NSDecimalFormatter 无法正确格式化NSDecimalNumbers(请参阅iOS: formatting decimal numbers)。 但也许它可以从一个字符串正确地创建一个NSDecimalNumber

    【讨论】:

      【解决方案2】:

      我认为问题不在于 NSNumberFormatter 的限制,而在于 double 本身的限制。

      Objective-C 中双精度的最大值是 15 位,我认为这是一个很好的线索,可以了解您的程序中发生了什么。

      我认为当你这样做时¨

      [NSNumber numberWithDouble:[tempString doubleValue]]];
      

      您正在限制 NSNumber 的值,因为 doubleValue 将有一个限制!

      【讨论】:

      • 我想过这个,但是正如你在我的帖子中看到的那样, NSLog(@"number: %@",[NSNumber numberWithDouble:[tempString doubleValue]]);打印没有任何截断的正确值。当位数大于 16 时开始截断。
      • 你试过使用 [numberFormatter setMaxium: ] 吗?您还可以访问最大值并读取它的值
      • 你检查过最大值吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-05
      • 1970-01-01
      相关资源
      最近更新 更多