XSD を使用してシリアル化されたオブジェクトを介して XML を出力する必要があります。私のコードはこれを成功させましたが、助けが必要な問題が 1 つあります。
私は GAD (XSD から XSD.exe ツールを使用して自動生成) という名前のクラスを持っています。XSD では、この要素は次のように定義されています<xs:element name="Total" type="xs:decimal"/>
。私の最終出力は、20.00 などの通貨形式の 10 進数を必要とするサードパーティの検証ツールに送られます。
私の入力は DataTable です。これは現在、CSV ファイルから派生しています (ただし、最終的にはデータベースから直接取得する予定です)。DataTable は、OleDbDataAdapter を使用して CSV から取り込まれます。現在、20.00 などの値は double 型の列に格納されているため、たとえば、整数の値は 20.0 に「切り捨て」られます。
double 値が 20.0 の DataRow から、値が 20.00 の decimal オブジェクト フィールドに移動する必要があります。
これを達成しようとして、私が思いついた最善の方法は、double をこのような形式の文字列に変換し、Math.Round を使用して、10 進数に戻すときに小数点以下 2 桁を指定することです。次のようになります。
string dstr = dr["Total"].ToString(); //store the data row value in a string
double d = Convert.ToDouble(dstr); //store the value in a double
dstr = d.ToString("0.00"); //convert the double to a formatted string
decimal NewDec = Math.Round(Convert.ToDecimal(dstr), 2); //decimal value trying to retain decimal places
GAD.Total = NewDec; //finally store value in my object's field
しかし、うまくいきません。GAD.Total に格納されるのはわずか 20 です。
私はこの振る舞いを理解しようとして遊んでいましたが、これはまったくわかりません。コンソールを使用して 10 進数値を書き出すと、20.00 と表示されますが、値の上にカーソルを置くと、20 として保存されていることが示されます。
class Program
{
static void Main(string[] args)
{
double d = 20.0;
Console.Write("Cast double as string with format:");
Console.WriteLine(d.ToString("0.00"));
string dstr = d.ToString("0.00");
Console.Write("Cast as string then back to decimal rounded 2 places:");
Console.WriteLine(Math.Round(Convert.ToDecimal(dstr),2));
d = 20;
dstr = d.ToString("0.00");
Console.WriteLine(Math.Round(Convert.ToDecimal(dstr), 2));
decimal NewDec = Math.Round(Convert.ToDecimal(dstr), 2);
Console.Write("Stored in a decimal: ");
Console.WriteLine(NewDec);
Console.Read();
}
}
だから、私は2つの質問があります:
- この例の NewDec の値が 20 として保存されているのに、コンソールでは 20.00 として出力されるのはなぜですか?
- DataRow に 20.0 として格納されている double から、オブジェクト フィールドに 20.00 として保持されている 10 進数にするにはどうすればよいですか?
ご清聴ありがとうございました。ご協力をお願いいたします。