簡體   English   中英

C#將DataRow中的Double類型轉換為對象中的十進制以進行XSD序列化

[英]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. 為什么在此示例中,NewDec的值存儲為20,但控制台輸出為20.00?
  2. 我怎樣才能將存儲在DataRow中的雙精度數從20.0變為保留在對象字段中的小數點20.00?

感謝您的關注,如果您能為我提供任何幫助,我將不勝感激。

我仍然不知道問題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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM