从字符串转换为double时,点被移除,例如。铸造后加倍0.01,得到1,或3.22,得到322。
以下是我使用的代码。
在日志文件中我得到了
使用前: - 0.01
之后解析: - 1
while (reader.Read())
{
XmlNodeType nType = reader.NodeType;
if (nType == XmlNodeType.Element && reader.Name == "DepartmentUser")
{
UserData user = new UserData();
while (reader.MoveToNextAttribute())
{
if (reader.Name == "UserName")
{
user.UserName = Convert.ToString(reader.Value);
}
else if (reader.Name == "UserID")
{
user.UserGUID = Convert.ToString(reader.Value);
}
else if (reader.Name == "UserUsage")
{
Logger.TraceLog(LogLevel.Debug, string.Format("Before Usage :- {0}", reader.Value));
//user.DiskUsage = Convert.ToDouble(reader.Value);
user.UserUsage = double.Parse(reader.Value);
Logger.TraceLog(LogLevel.Debug, string.Format("After it Parse :- {0}", user.UserUsage));
}
}
}
}
这是由于文化吗?
答案 0 :(得分:2)
你可以尝试,这会使结果对文化不敏感。
double.Parse(reader.Value, System.Globalization.CultureInfo.InvariantCulture);
答案 1 :(得分:2)
我强烈怀疑这确实是一个文化问题 - 你的线程当前的文化可能使用.
作为分组分隔符而不是小数分隔符。实际上,在某些文化中,您的代码只会因异常而失败。这是一个证明问题的例子:
using System;
using System.Globalization;
using System.Threading;
class Test
{
static void Main()
{
var german = CultureInfo.GetCultureInfo("de-DE");
var english = CultureInfo.GetCultureInfo("en-GB");
var text = "1.5";
Thread.CurrentThread.CurrentCulture = german;
Console.WriteLine(double.Parse(text) == 1.5); // False
Thread.CurrentThread.CurrentCulture = english;
Console.WriteLine(double.Parse(text) == 1.5); // True
}
}
鉴于您要转换XML的内容,我会使用XmlConvert.ToDouble
代替。假设XML遵循标准表示(在此处显示),那将“做正确的事”。
在这种情况下,这相当于在调用double.Parse
时指定不变文化(我相信),但我更喜欢XmlConvert
方法,因为:
DateTime
)请注意,如果您可以使用LINQ to XML读取整个XML文档,那么您可能会发现更简单 - 然后您可以将属性转换为double
。 (XmlReader
是一个痛苦的问题 - 我建议只在真正因文档大小而必须使用它时...即使这样,你也可以将子树加载到LINQ to XML中类型。)
答案 2 :(得分:-1)
尝试使用Convert.ToDouble
https://msdn.microsoft.com/en-us/library/zh1hkw6k(v=vs.110).aspx
答案 3 :(得分:-2)
要将字符串解析为double,您需要使用conver.ToDouble()。
问候!