我需要使用 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();
}
}
所以,我有两个问题:
- 为什么本例中 NewDec 的值存储为 20 而控制台输出为 20.00?
- 如何从作为 20.0 存储在 DataRow 中的双精度数到作为 20.00 保存在对象字段中的小数点?
感谢您的关注,如果您能为我提供任何帮助,我将不胜感激。