在 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();
只要我将<price>
设置为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
,该属性使用带有适当 CultureInfo
或 NumberFormatInfo
的 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 反序列化的主要内容,如果未能解决你的问题,请参考以下文章