3

XML ファイルを使用してユーザー データを保存しています。ファイルは、異なるローカリゼーションから保存およびロードできます。カルチャに応じて、倍数は "1.2345" または "1,2345" として保存できます。違いは小数点記号です。

現在、解析に次のコードを使用しています。

private double StringToDouble(string input)
{
    string decimalPoint = NumberFormatInfo.CurrentInfo.NumberDecimalSeparator;

    if (!input.Contains(decimalPoint))
    {
        input = input.Replace(".", decimalPoint);
        input = input.Replace(",", decimalPoint);
    }

    return double.Parse(input);
}

上記のコードはうまく機能しますが、明らかに最善ではありません。より良いソリューションを提供できますか?

4

3 に答える 3

2

double を文字列ではなく double プリミティブとして xml ファイルにシリアル化すると、"." で保存されます。そのため、インバリアント カルチャで解析できます。

テキストとして保存されている場合は、次のようなことを試すことができます。

double result = double.Parse(input.Replace(",", "."), CultureInfo.InvariantCulture);

「1.234.567,89」のような数字の千単位の区切り文字にはまだ問題があることに注意してください。

于 2012-07-23T13:07:35.310 に答える
2

正直なところ、あなたの現在の解決策がそれほど悪いとは思いません。エレガントではありませんが、エレガントではないデータが与えられます。他の人が示唆しているように、XML ファイルを一貫した形式で取得できるかどうか、または少なくともXML ファイルをカルチャ情報と共に保存できるかどうかを確認します。

<yourRootElement xml:lang="en-US">

そうすれば、推測する必要がなくなります。

それを除けば、次のようなこともできます。

private double StringToDouble(string input)
{
    var last = input.LastIndexOfAny(new[] {',', '.'});
    var separator = last >= 0 ? input[last] : '.';
    var clone = (CultureInfo)CultureInfo.InvariantCulture.Clone();
    clone.NumberFormat.NumberDecimalSeparator = separator.ToString(CultureInfo.InvariantCulture);
    return double.Parse(input, clone);
}

CultureInfo.Cloneコストがかかりますが、区切り記号に基づいてカルチャ情報をキャッシュできます。これにより、必要に応じて、さまざまな桁区切り記号を柔軟に設定することもできます。小数点記号に応じて、千単位の区切り記号が何であるかを想定する必要があります。

于 2012-07-23T13:13:36.380 に答える
0

数値を固定の fformat、つまり固定の小数点記号で保存することをお勧めします。これは、ユーザーのカルチャから数値を保存する必要があるカルチャへの変換を実行する必要があることを意味します。

于 2012-07-23T13:00:48.200 に答える