将字符串转换为双倍,点被删除

Casting string to double, dot gets removed

从字符串转换为双精度时,点被删除,例如。对于 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));
            }
        }
    }
}

这是文化的原因吗?

您可以试试,这会使结果不区分文化。

double.Parse(reader.Value, System.Globalization.CultureInfo.InvariantCulture);

尝试使用Convert.ToDouble代替

https://msdn.microsoft.com/en-us/library/zh1hkw6k(v=vs.110).aspx

我强烈怀疑这确实是一个文化问题 - 您线程的当前文化可能使用 . 作为分组分隔符而不是小数点分隔符。事实上,在某些文化中,您的代码只会因异常而失败。这是一个演示问题的示例:

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。这将 "do the right thing" 假设 XML 遵循标准表示(它出现在这里)。

在这种情况下,这相当于在调用 double.Parse 时指定不变文化(我相信),但我更喜欢 XmlConvert 方法,因为:

  • 上下文更"clearly correct"
  • 您可以将此模式应用于其他类型(例如 DateTime

请注意,如果您可以使用 LINQ to XML 来阅读整个 XML 文档,您可能会发现这更简单 - 然后您可以将属性转换为 double 代替。 (XmlReader 令人头疼 - 我建议只在 确实 由于文档大小而不得不使用它时才使用它......即使那样,你也可以将子树加载到LINQ to XML 类型。)

要将字符串解析为双精度值,您需要使用 conver.ToDouble()

此致!