在 C# 中使用德文小数分隔符对双精度值进行 XML 反序列化

Posted

技术标签:

【中文标题】在 C# 中使用德文小数分隔符对双精度值进行 XML 反序列化【英文标题】:XML-Deserialization of double value with German decimal separator in C# 【发布时间】:2012-01-17 19:44:06 【问题描述】:

我正在尝试从“德语”xml 字符串中反序列化 Movie 对象:

string inputString = "<?xml version=\"1.0\"?>"
    + "<movie title=\"Great Bollywood Stuff\">"
    + "<rating>5</rating>"
    + "<price>1,99</price>" // <-- Price with German decimal separator!
    + "</movie>";

XmlSerializer movieSerializer = new XmlSerializer(typeof(Movie));
Movie inputMovie;

using (StringReader sr = new StringReader(inputString))

    inputMovie = (Movie)movieSerializer.Deserialize(sr);

System.Console.WriteLine(inputMovie);

这里是Movie 类供参考:

[XmlRoot("movie")]
public class Movie


    [XmlAttribute("title")]
    public string Title  get; set; 

    [XmlElement("rating")]
    public int Rating  get; set; 

    [XmlElement("price")]
    public double Price  get; set; 

    public Movie()
    

    

    public Movie(string title, int rating, double price)
    
        this.Title = title;
        this.Rating = rating;
        this.Price = price;
    

    public override string ToString()
    
        StringBuilder sb = new StringBuilder("Movie ");
        sb.Append("[Title=").Append(this.Title);
        sb.Append(", Rating=").Append(this.Rating);
        sb.Append(", Price=").Append(this.Price);
        sb.Append("]");

        return sb.ToString();
    


只要我将&lt;price&gt; 设置为1.99,它就可以完美运行。当我使用德语德语小数分隔符1,99 它不再工作了。

请指教

【问题讨论】:

xml 是以这种格式提供给我的,我对此无能为力。不过谢谢你的回答! 重要提示:货币值几乎总是十进制,而不是双精度 【参考方案1】:

如前所述,XmlSerializer 不是适合您的工具,因为它将使用 W3C 模式数据类型规范。

替代解决方案包括使用 XSLT 文件在反序列化之前转换输入 XML,或使用其他工具(如 Linq to XML)。

【讨论】:

你能给个样品吗? ***.com/questions/647991/…可能会给你一些翻译思路【参考方案2】:

如前所述,这根本不是在 XML 中表示数值的有效方式。不过,这对字符串来说很好。你可以这样做:

[XmlIgnore]
public decimal Price get;set;

[XmlElement("price")]
public string PriceFormatted 
    get  return Price.ToString(...); 
    set  Price = decimal.Parse(value, ...);  

其中“...”代表您选择的格式说明符和 CultureInfo

【讨论】:

就我而言 CultureInfo.GetCultureInfo("de-DE").NumberFormat【参考方案3】:

在 XML-Schema 规范中,double/decimal 需要用 . 表示,因此这种行为是设计使然。

您可以将 Price 类型替换为字符串,然后拥有一个非序列化属性 Realprice,该属性使用带有适当 CultureInfoNumberFormatInfo 的 Double.TryParse。

[XmlRoot("movie")] 
public class Movie      
      [XmlElement("price")]     
      public string Price  get; set;   

      [XmlIgnore]
      public double RealPrice  
         get  
               double resultprice;
               if (!Double.TryParse(
                  Price, 
                  NumberStyles.Any, 
                  new CultureInfo("de-DE"),
                  resultprice)) throw new ArgumentException("price");
               // resultprice is now parsed, if not an exception is thrown
               return resultprice;
               
       

【讨论】:

以上是关于在 C# 中使用德文小数分隔符对双精度值进行 XML 反序列化的主要内容,如果未能解决你的问题,请参考以下文章

当全球化将逗号设置为小数分隔符时,如何在 OpenXML Excel 单元格中存储小数/双精度

如何将双精度值格式化为点后两位小数且分隔符为千位的字符串?

在python中使用本地化的千位分隔符和小数精度格式化数字

用逗号作为小数分隔符解析双精度

强制点(“。”)作为java中的小数分隔符

强制点(“。”)作为java中的小数分隔符