0

我需要使用 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.Total 中存储的只有 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. 如何从作为 20.0 存储在 DataRow 中的双精度数到作为 20.00 保存在对象字段中的小数点?

感谢您的关注,如果您能为我提供任何帮助,我将不胜感激。

4

1 回答 1

1

我仍然不知道问题 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>

于 2013-06-06T11:27:00.340 回答