【问题标题】:C# XML Serialization and Decimal ValueC# XML 序列化和十进制值
【发布时间】:2012-05-06 23:49:58
【问题描述】:

我正在使用 XmlSerializer 将包含小数点的 C# 对象序列化为 xml 字符串

例如

AnObject.ADecimalValue

我发现精度特别不同,即使我明确地四舍五入如下,一些值在该点之后得到四个值的输出,例如12564.39 得到输出为 12564.3900

AnObject.ADecimalValue = decimal.Round(AnObject.ADecimalValue, 2);

序列化代码如下。

   XmlSerializer serializer = new XmlSerializer(typeof(AnObject));

    using (StringWriter writer = new StringWriter())
    {
        serializer.Serialize(writer, source);

        string result = writer.ToString();

        return result;
    }

如何保证小数点后只输出两个值

【问题讨论】:

    标签: c# xml xml-serialization decimal


    【解决方案1】:

    我不认为对浮点数进行四舍五入可以对此有所帮助。序列化程序根据自己的规则将数字转换为字符串。您可以做的最好的事情是引入一个新的字符串属性,并将其中的数字格式化并序列化它而不是原始数字。

    有关该主题的更多信息,类似问题: Can you specify format for XmlSerialization of a datetime?

    【讨论】:

      【解决方案2】:

      您能否实现IXmlSerializable 来重新定义您序列化对象的方式?

      文档here 以及如何实现它的详细分解here

      然后有一个帖子here 由与您有类似(但不相关)问题的人发布。你可以正确地四舍五入你的小数,看看是否可行,如果不行,你可以把它写成一个字符串。

      【讨论】:

        【解决方案3】:

        这是我解决类似问题的方法,它对我来说非常有效。

            private decimal  price;
        
            [XmlElement(DataType="decimal")]
            public string  Price
            {
                get { return price.ToString("c"); }
                set { price = Convert.ToDecimal(value); }
            }
        

        在我的例子中,我将其转换为货币,但您可以使用 price.ToString("0.00") 将 XML 元素转换为带有 2 个零的十进制。

        【讨论】:

        • 添加 DataType="decimal" 参数给了我一个运行时 InvalidOperationException 消息“十进制是 XmlElementAttribute.DataType 属性的无效值。十进制不能转换为 System.String。” (请注意,消息已本地化,我将其翻译回英文,因此可能会有所不同)。
        猜你喜欢
        • 2010-12-09
        • 1970-01-01
        • 2011-09-24
        • 1970-01-01
        • 1970-01-01
        • 2011-04-19
        • 1970-01-01
        • 2020-08-22
        • 2012-02-02
        相关资源
        最近更新 更多