0

DB からの金額の文字列値があります。私のシステムのローカル文化はポルトガル語 (pt-br) です。その結果、10 進値の金額は、たとえば 3.4 の場合は 3,4 と読み取られます。3.4 が表示されるようにこれを解析する必要がありますが、代わりに何を試しても 34 になります。解決策をあらゆる場所で検索し、以下を実装しようとしましたが、無駄でした。

// ここで、row[item.columnName] は、ループしている DataTable の行です

解決策 1:

 Double amt = Double.Parse(Convert.ToString(row[item.columnName]), CultureInfo.InvariantCulture);

解決策 2:

CultureInfo usCulture = new CultureInfo("en-US");
NumberFormatInfo dbNumberFormat = usCulture.NumberFormat;
Double amt = Double.Parse(Convert.ToString(row[item.columnName]), dbNumberFormat);

どちらも機能していないようです。これを達成できる他の方法があれば、誰かが提案できますか?

編集:

DB から取得している値が 10 進数であることが判明したため、LOC を以下に変更しました。

decimal d = decimal.Parse(Convert.ToString(row[item.columnName]),new System.Globalization.CultureInfo("pt-BR", false));

まだ機能していないようで、どこが間違っているのかわかりません。DotNetFiddleで同じことを試してみましたが、 まったく問題なく動作します。以下は私が試したコードです。

using System;

public class Program
{
    public static void Main()
    {
        decimal d = decimal.Parse("1,35",new System.Globalization.CultureInfo("pt-BR", false));
        Console.WriteLine(d.ToString());
    }
}

得られた結果は、予想どおり 1.35 でした。私は何を間違っていますか?

4

4 に答える 4

0

次のように試すことができます:

var x = decimal.Parse("yourDecimal", new NumberFormatInfo() { NumberDecimalSeparator = "," });
于 2015-10-12T11:01:12.183 に答える
0

データベースから double 値を取得する場合、これは解析の問題ではありません。ソリューション 1では、正しい double 値を文字列に変換し (カルチャを指定しないため、文字列はポルトガル語の形式で書式設定されます)、ポルトガル語の文字列を不変カルチャで解析します,

英語のカルチャで数値をフォーマットする場合は、現在のカルチャを英語に設定するだけです。

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");

または、double を string に変換するときにカルチャを指定するだけです。

var en = CultureInfo.GetCultureInfo("en-US");
// ...
((double)row[item.columnName]).ToString(en);
于 2015-10-12T11:12:12.920 に答える
0

ポトルガルの文化情報を利用できます

CultureInfo usCulture = new CultureInfo("pt-PT", false);
NumberFormatInfo dbNumberFormat = usCulture.NumberFormat;
Double amt = Double.Parse(Convert.ToString(row[item.columnName]), dbNumberFormat);

また

Double amt = Double.Parse(Convert.ToString(row[item.columnName]), new CultureInfo("pt-PT", false));
于 2015-10-12T11:04:23.273 に答える
0

たぶんrow[item.columnName]、すでにdoubleですか?何をrow[item.columnName].GetType()返しますか?

double(ボックス化された) を取得して (カルチャを指定せずに) 文字列にフォーマットし、その文字列を (カルチャを指定して) に解析する理由はありませんdouble。2 番目のパラメーターとして(a の可能性がある)Convert.ToStringを取るオーバーロードがある場合でも。IFormatProviderCultureInfo

多分

double amt = (double)row[item.columnName];

動作します?がある場合は、またはdecimalを使用します。decimal amt = (decimal)row[item.columnName];double amt = (double)(decimal)row[item.columnName];

row[item.columnName].GetType()が本当に String の場合、それにキャストします。

double amt = Double.Parse((string)row[item.columnName], someGoodCulture);

すでに存在するものをダウンキャストするだけなのか、現在のスレッドの現在のカルチャに従ってインスタンス ( aや aなど) をフォーマットしたり、単に任意のオブジェクトを呼び出したりするのConvert.ToStringかを確認するのが難しいため、個人的には嫌いです。stringIFormattabledoubledecimal.ToString()

于 2015-10-12T11:16:27.483 に答える