簡體   English   中英

C#將十進制序列化為xml

[英]C# serialize decimal to xml

我有一個小數屬性,比如

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

問題是我想強制它總是以 2 的精度序列化,但如果價格是 10.50,它將被序列化為 XML,如<Price>10.5</Price>

有什么方法可以強制它(不創建新屬性或更改此屬性的獲取?我正在尋找一些方法來做到這一點,只將模式發送到 XmlSerializer(或 XmlElementAttribute)或任何聰明的方法來做到這一點?

謝謝

我遇到了相反的問題。 我的小數用 4 個小數位進行序列化,即使它們都是 4 個零。 我發現如果我調用decimal.Round(value, 2)那么它會序列化到 2 個小數位。 看起來 Decimal 類型在序列化時也會記住您上次對其進行四舍五入的內容。

我對這個建議持懷疑態度,但它很簡單。 盡管該值不需要四舍五入,但調用 Round 會改變序列化中出現的小數位數。

您可以將XmlIgnore添加到實際的十進制屬性並引入一個新屬性 PriceAsString,它以字符串形式返回,嗯,價格(10.5 0格式)。

您當然也可以實現IXmlSerializable並自己做所有事情。

然而,這些方式都不是真正的搖滾,你已經說過無論如何你都不會走這條路……

我有幾個int分配給decimal屬性(要序列化的對象)。 XML Serializer 需要用 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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM