NSNumberFormatterを使用してObjCで非常に大きな数値をフォーマットするという予期しない動作が発生しています。
数値フォーマッタは、小数桁に関係なく、15桁目以降の小数(NSDecimalNumber)を丸めているようです。
以下のテストは、値1、3、および5で失敗します。
2つのリクエスト:
- 代替コードに関する提案をいただければ幸いです。
- 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);
}