【问题标题】:C# serialize decimal to xmlC#将十进制序列化为xml
【发布时间】:2010-12-09 10:57:54
【问题描述】:

我有一个小数属性,比如

[XmlElementAttribute(DataType = "decimal")] decimal Price

问题是我想强制它总是以 2 的精度序列化,但如果价格是 10.50,它将被序列化为 XML,如<Price>10.5</Price>

有任何方法可以强制它(无需创建新属性或更改此属性的获取?我正在寻找一些方法来做到这一点,只需将模式发送到 XmlSerializer(或 XmlElementAttribute)或任何智能方法这样做?

谢谢

【问题讨论】:

标签: c# xml serialization


【解决方案1】:

我遇到了相反的问题。我的小数用 4 个小数位进行序列化,即使它们都是 4 个零。我发现如果我打电话给decimal.Round(value, 2),那么它会序列化到小数点后两位。看起来 Decimal 类型 remembers 在序列化时您上次对其进行了四舍五入。

我对这个建议持怀疑态度,但它很简单。尽管该值不需要四舍五入,但调用 Round 会改变序列化中出现的小数位数。

【讨论】:

  • 不错!我所做的只是在设置值时使用具有所需精度的 decimal.Round。这是真正的答案!
  • 我被要求输出硬编码值 '0.00' 并且(在 VB.NET 中)这是唯一有效的方法:Decimal.Round(0.00D, 2)
  • 它是有效的,因为十进制以浮点存储值(即 550.0000 存储为 5500000 * 10^-4,如果将其四舍五入到 2 位小数,它将是 55000 * 10^-2),显然,序列化程序只取其中的任何内容,然后根据指数放置小数点。
  • 如果你有一个 1dp 的小数,这不起作用,你试着把它四舍五入到 2。
  • 我这样做:decimal.Round(value*1.00m, 2)
【解决方案2】:

您可以将XmlIgnore 添加到实际的十进制属性中,并引入一个新属性 PriceAsString,它以字符串形式返回,嗯,价格(10.50 格式)。

您当然也可以实现 IXmlSerializable 并自己做所有事情。

但是,这些方式都不是真正的摇滚,而且你已经说过无论如何你都不会走这条路......

【讨论】:

    猜你喜欢
    • 2012-05-06
    • 1970-01-01
    • 2017-07-22
    • 2017-07-19
    • 1970-01-01
    • 2019-10-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多