2

中間層はシリアル化されたオブジェクトを送信し、サーバー上の Java での数学演算のために 0 が 0E+3 として送信されることがあります。オブジェクトを逆シリアル化すると、XmlException --> System.OverflowException が発生します。これは、値が 10 進数に対して大きすぎるか小さすぎるためです。

decimal.Parse がこの変換を処理できないのはなぜですか?

このような数字からクライアントを保護する方法はありますか?

4

3 に答える 3

3

あなたは試すことができます:

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);
}
于 2011-04-29T16:30:27.450 に答える
1

Java はおそらくこの計算を double として行っています (つまり、Decimal の余分な精度も必要ないということです)。

必要な場合はE[+-]?([0-9]+)$、正規表現を使用して手動で削除し、自分で乗算を行ってください。^0Eまたは、特殊なケースとして一致し (NumberStyles.Any処理できないようです)、単に 0 を返します。

于 2011-04-29T16:14:10.857 に答える
0

float または double に変更すると、正しく解析されます。注意が必要ですが、精度はかなり低くなります (float の場合は 7 桁、double の場合は 15 ~ 16 桁、decimal の場合は 28 ~ 29 桁)。

于 2011-04-29T16:08:32.740 に答える