1

私は多くのファイル解析を行います。これには、10進数などのデータ型の解析が含まれます。コードを読みやすくするために、私は次の方法を使用しています。

public static decimal? ToDecimal(this string data)
{
    decimal result;
    if (decimal.TryParse(data, NumberStyles.Integer | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out result))
        return result;

    return null;
}

これは、小数点記号としてピリオド/ピリオドで表される小数に対しては正常に機能します。ただし、この関数を他の標準の小数点、特にコンマで機能させたいと思います。(アラビア語の小数点記号もあることを読みました:http://en.wikipedia.org/wiki/Decimal_mark#Other_numeral_systems、しかしそれはおそらく東部のアラビア数字も解析できることに依存しています)。

データは必ずしも処理を実行しているマシンで作成されるとは限らないため、Culture.CurrentCultureは適切ではありません。だから私は今これを持っています:

private static CultureInfo CreateCultureWithNumericDecimalSeparator(string separator)
{
    var cultureInfo = (CultureInfo)CultureInfo.InvariantCulture.Clone();
    cultureInfo.NumberFormat.NumberDecimalSeparator = separator;
    return cultureInfo;
}

private static CultureInfo[] cultureInfos = new CultureInfo[]
{
    CultureInfo.InvariantCulture,
    CreateCultureWithNumericDecimalSeparator(",") // Normal comma
};

public static decimal? ToDecimal(this string data)
{
    foreach (CultureInfo cultureInfo in cultureInfos)
    {
        decimal result;
        if (decimal.TryParse(data, NumberStyles.Integer | NumberStyles.AllowDecimalPoint, cultureInfo, out result))
            return result;
    }

    return null;
}

これは機能しますが、特にTryParseがあらゆる種類の設定(千の区切り文字、16進指定子、通貨記号、指数など)をチェックしていることを考えると、2回の解析は少し重いようです。これはおそらくパフォーマンスの問題ではありませんが、これを行うためのより効率的な方法があるかどうか、あるいはフレームワーク内の既存の方法があるかどうかを知りたいのですが。そして、おそらく現代の使用で他の記数法に対処できる方法でさえありますか?ありがとう。

4

1 に答える 1

0

フレームワークはこれを直接提供していないようです。興味深いことに、別の質問への回答は、カルチャ セットを使用しても、フレームワークが東アラビア数字を解析するためのメカニズムを提供しないことを示唆しています。東アラビア数字の要件は私のアプリの理論的なものにすぎないため、既に上記で取得したコードをそのまま使用しています。もっと具体的に実装したら、投稿します!

于 2012-08-16T14:04:00.477 に答える