C# 将十进制序列化为 xml

问题描述 投票:0回答:3

我有一个小数属性,比如

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

问题是我想强制它始终以 2 的精度进行序列化,但如果价格是 10.50,它将被序列化为 XML,如

<Price>10.5</Price>

有什么方法可以强制它(无需创建新属性或更改此属性的获取?我正在寻找某种方法来执行此操作,仅将模式发送到 XmlSerializer (或 XmlElementAttribute)或任何智能方法来执行此操作?

谢谢

c# xml serialization
3个回答
30
投票

我遇到了相反的问题。我的小数序列化为 4 个小数位,尽管它们都是 4 个零。我发现如果我调用

decimal.Round(value, 2)
那么它会序列化到小数点后两位。看起来 Decimal 类型在序列化时也会记住您最后舍入的内容。 我对这个建议表示怀疑,但它的作用很简单。即使该值不需要舍入,调用 Round 也会改变序列化中显示的小数位数。

请注意,根据下面的注释,如果数字的 d.p. 少于 2 个 d.p.,则

decimal.Round()

也会执行同样的操作,因此最好的选择是先乘以 1.00m,这可确保小数点包含 2 d.p.。在幕后,即

decimal.Round(value * 1.00m)
    


8
投票
XmlIgnore

添加到实际的小数属性中,并引入一个新属性 PriceAsString ,它以字符串形式返回价格(以 10.5

0
格式)。 您当然也可以实现

IXmlSerializable

并自己完成所有事情。


然而,这些方法都不是真正的可靠,而且你已经说过无论如何你都不会走这条路......


1
投票
int

分配给了

decimal
属性(要序列化的对象)。 XML 序列化程序需要将它们写入 2 位小数,但结果却没有小数。
假设

var myInt = 3;

没有成功:

设置需要序列化的属性

obj.Property = decimal.Round((decimal)myInt, 2);

导致序列化时不写入小数。

成功:

obj.Property = decimal.Parse(d.ToString("n2", CultureInfo.InvariantCulture), NumberStyles.Any, CultureInfo.InvariantCulture);

我得到两位小数。

现在我使用这些扩展方法来设置属性:

/// <summary> /// For XML serialization. /// </summary> public static class DecimalSerializationHelper { public static decimal WithTwoDecimals(this decimal d) => decimal.Parse(d.ToString("n2", CultureInfo.InvariantCulture), NumberStyles.Any, CultureInfo.InvariantCulture); public static decimal WithTwoDecimals(this int x) => ((decimal)x).WithTwoDecimals(); }

这样读起来就像

obj.Property = myInt.WithTwoDecimals();

© www.soinside.com 2019 - 2024. All rights reserved.