我在使用 NSNumberFormatter 在 ObjC 中格式化非常大的数字时遇到了意外行为。
无论小数位数如何,数字格式化程序似乎都会在第十五位数之后舍入小数(NSDecimalNumber)。
以下测试在值 1,3 和 5 上失败。
两个请求:
- 任何关于替代代码的建议将不胜感激?
- 我认为问题是由于在 NSNumberFormatter 中使用了硬编码的数字限制而发生的?
如果出现问题,此处的帖子列出了没有足够描述的解决方法。此外,我们的应用程序(银行业)在多个国家/地区运行,我们将格式链接到后端配置的用户区域设置。这种解决方法意味着我们编写自己的数字格式化程序来处理要求。我不想做的事情。
- (void)testFormatterUsingOnlySDK {
NSDecimalNumber *value1 = [NSDecimalNumber decimalNumberWithMantissa: 9423372036854775808u exponent:-3 isNegative:YES];
NSDecimalNumber *value2 = [NSDecimalNumber decimalNumberWithMantissa: 9999999999999990u exponent:-3 isNegative:YES];
NSDecimalNumber *value3 = [NSDecimalNumber decimalNumberWithMantissa: 9999999999999991u exponent:-3 isNegative:YES];
NSDecimalNumber *value4 = [NSDecimalNumber decimalNumberWithMantissa: 99999999999999900u exponent:-4 isNegative:YES];
NSDecimalNumber *value5 = [NSDecimalNumber decimalNumberWithMantissa: 11111111111111110u exponent:-4 isNegative:YES];
NSNumberFormatter *formatter = [[[NSNumberFormatter alloc] init] autorelease];
formatter.allowsFloats = YES;
formatter.maximumFractionDigits = 3;
[self assertStringAreEqualWithActual:[formatter stringFromNumber:value1] andExpeted: @"-9423372036854775.808"];
[self assertStringAreEqualWithActual:[formatter stringFromNumber:value2] andExpeted: @"-9999999999999.99"];
[self assertStringAreEqualWithActual:[formatter stringFromNumber:value3] andExpeted: @"-9999999999999.991"];
[self assertStringAreEqualWithActual:[formatter stringFromNumber:value4] andExpeted: @"-9999999999999.99"];
[self assertStringAreEqualWithActual:[formatter stringFromNumber:value5] andExpeted: @"-1111111111111.111"];
}
- (void)assertStringAreEqualWithActual:(NSString *)actual andExpeted:(NSString *)expected {
STAssertTrue([expected isEqualToString:actual], @"Expected %@ but got %@", expected, actual);
}