我有一个小数属性,比如
[XmlElementAttribute(DataType = "decimal")] decimal Price
问题是我想强制它始终以 2 的精度进行序列化,但如果价格是 10.50,它将被序列化为 XML,如
<Price>10.5</Price>
。
有什么方法可以强制它(无需创建新属性或更改此属性的获取?我正在寻找某种方法来执行此操作,仅将模式发送到 XmlSerializer (或 XmlElementAttribute)或任何智能方法来执行此操作?
谢谢
我遇到了相反的问题。我的小数序列化为 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)
。XmlIgnore
添加到实际的小数属性中,并引入一个新属性 PriceAsString ,它以字符串形式返回价格(以 10.5
0格式)。 您当然也可以实现
IXmlSerializable
并自己完成所有事情。
然而,这些方法都不是真正的可靠,而且你已经说过无论如何你都不会走这条路......
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();