[英]C# Double type in DataRow to Decimal in Object for XSD serialisation
我需要使用XSD通過序列化對象輸出XML。 我的代碼成功實現了這一點,但是有一個問題需要我幫助。
我有一個名為GAD的類(使用XSD的XSD.exe工具自動生成),其中包含一個名為total的字段,其類型為小數。 在XSD中,該元素定義為<xs:element name="Total" type="xs:decimal"/>
我的最終輸出將輸入到第三方驗證工具,該工具要求使用貨幣格式的小數,例如20.00。
我的輸入是一個數據表。 當前,這是從CSV文件派生的(盡管最終我將直接從數據庫中獲取它)。 使用OleDbDataAdapter從CSV填充DataTable。 當前,例如20.00之類的值存儲在雙精度類型的列中,因此整數的值例如被“截斷”為20.0。
我需要從持有20.0的雙精度值的DataRow轉到值為20.00的小數對象字段
為了實現這一點,我想出的最好辦法是將雙精度型轉換為具有這種格式的字符串,然后在轉換回十進制時使用Math.Round指定兩個小數位。 看起來像這樣:
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中存儲的內容總計只有20。
我在玩弄,試圖弄清楚這種行為,我一點也不明白。 如果我使用控制台寫出十進制值,它將顯示為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();
}
}
因此,我有兩個問題:
感謝您的關注,如果您能為我提供任何幫助,我將不勝感激。
我仍然不知道問題1的答案,但是我已經解決了問題2。
按照此鏈接http://social.msdn.microsoft.com/Forums/en-US/csharplanguage/thread/d7582772-ab2c-4f05-9ba3-c96728dfbe82,我更改了GAD類的定義。
[XmlIgnore]
public decimal Total
{
get
{
return this.totalField;
}
set
{
this.totalField = value;
}
}
[XmlElement("Total")]
public string TotalString
{
get
{
return Total.ToString("F2");
}
set
{
decimal total = 0;
if (Decimal.TryParse(value, out total))
Total = total;
}
}
現在,當我從數據表中初始化對象字段時,我可以簡單地使用GAD.Total = Convert.ToDecimal(dr["Total"]);
XML的序列化輸出始終返回帶有兩位小數的數字值,如下所示: <Total>30.00</Total>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.