将字符串转换为double,dot将被删除

时间:2015-04-24 10:27:11

标签: c# xml xml-parsing

从字符串转换为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));
            }
        }
    }
}

这是由于文化吗?

4 个答案:

答案 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)

答案 3 :(得分:-2)

要将字符串解析为double,您需要使用conver.ToDouble()

问候!