中間層はシリアル化されたオブジェクトを送信し、サーバー上の Java での数学演算のために 0 が 0E+3 として送信されることがあります。オブジェクトを逆シリアル化すると、XmlException --> System.OverflowException が発生します。これは、値が 10 進数に対して大きすぎるか小さすぎるためです。
decimal.Parse がこの変換を処理できないのはなぜですか?
このような数字からクライアントを保護する方法はありますか?
中間層はシリアル化されたオブジェクトを送信し、サーバー上の Java での数学演算のために 0 が 0E+3 として送信されることがあります。オブジェクトを逆シリアル化すると、XmlException --> System.OverflowException が発生します。これは、値が 10 進数に対して大きすぎるか小さすぎるためです。
decimal.Parse がこの変換を処理できないのはなぜですか?
このような数字からクライアントを保護する方法はありますか?
あなたは試すことができます:
decimal.Parse(numberText, System.Globalization.NumberStyles.Any)
編集:
残念ながら、これは 0E+3 では機能しません
作品:
Console.WriteLine(decimal.Parse("0", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("123.45", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("1.35E+6", System.Globalization.NumberStyles.Any));
Console.WriteLine(decimal.Parse("1.54E-5", System.Globalization.NumberStyles.Any));
動作しません:
Console.WriteLine(decimal.Parse("0E+3", System.Globalization.NumberStyles.Any));
問題数は常に 0E+3 ですか?
その場合、これを処理するヘルパー メソッドを作成できます。
decimal ParseDecimal(string number)
{
if (number.Equals("0E+3", StringComparison.OrdinalIgnoreCase))
{
return 0;
}
return decimal.Parse(number, System.Globalization.NumberStyles.Any);
}
Java はおそらくこの計算を double として行っています (つまり、Decimal の余分な精度も必要ないということです)。
必要な場合はE[+-]?([0-9]+)$
、正規表現を使用して手動で削除し、自分で乗算を行ってください。^0E
または、特殊なケースとして一致し (NumberStyles.Any
処理できないようです)、単に 0 を返します。
float または double に変更すると、正しく解析されます。注意が必要ですが、精度はかなり低くなります (float の場合は 7 桁、double の場合は 15 ~ 16 桁、decimal の場合は 28 ~ 29 桁)。