Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将字符串转换为双精度,圆点被移除_C#_Xml_Xml Parsing - Fatal编程技术网

C# 将字符串转换为双精度,圆点被移除

C# 将字符串转换为双精度,圆点被移除,c#,xml,xml-parsing,C#,Xml,Xml Parsing,当从字符串转换为双精度时,圆点会被移除,例如,转换为双精度后的0.01会得到1,或3.22会得到322 下面是我使用的代码 在日志文件中我得到 使用前:-0.01 之后解析:-1 while (reader.Read()) { XmlNodeType nType = reader.NodeType; if (nType == XmlNodeType.Element && reader.Name == "DepartmentUser") {

当从字符串转换为双精度时,圆点会被移除,例如,转换为双精度后的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


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

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的内容,我将使用。这将“做正确的事情”,假设XML遵循标准表示法(这里似乎是这样)

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

  • 对于上下文来说,它更“明确正确”
  • 这是一种可以应用于其他类型的模式(例如,
    DateTime

请注意,如果您可以使用LINQ to XML来读取整个XML文档,您可能会发现这更简单,然后您可以将属性转换为double。(
XmlReader
是一个让人头疼的问题-我建议只在由于文档大小而确实需要使用它的时候使用它…即使这样,您也可以将子树加载到LINQ to XML类型中。)

要将字符串解析为需要使用的双精度


问候

我不知道为什么会这样,但你可以简单地将它除以100,转换后得到原始的数字。但这个问题确实引起了我的好奇心。因此,我来看看它是否对我来说是一样的。当然是区域性设置,您很可能会将十进制分隔符设置为逗号,解析和强制转换是不同的事情。“你根本就不想打替身。”索姆纳特:好吧,我试过了,我明白为什么要打替身了。它与文化有点关系,因为它似乎使用了不同的十进制分隔符,而不是逗号,它会很好地工作。感谢@Sayse的建议,我会这样做。”使用ToDouble(String)方法相当于将值传递给Double.Parse(String)值是通过使用当前线程区域性的格式约定来解释的。看看这篇关于int.parse与ToInt32的文章。但是我没有花太多时间来写这个。如果值的类型是
object
而不是
string
,并且值为
null
,则会有差异。这些差异在这里并不相关。为什么OP“需要”使用它,而不是
double.Parse
?鉴于您链接到的文档中的注释,为什么您认为它的行为会有所不同?@Coline我使用了它,但它显示的是逗号(,)而不是点(.),即3.22转换为3.22感谢@Jon我像这个用户一样使用了。UserUsage=XmlConvert.ToDouble(reader.Value);但它显示逗号(,)而不是点(.),即3.22转换为3,22@Somnath:你说的“展示”是什么意思?什么显示了价值?日志?不要忘记值本身(解析时)只是一个数字。如果要在特定区域性中登录,应更改
string.Format
调用以执行此操作。日志文件中的结果为使用前:-3.22,解析后:-3,22。默认区域性为en。US@Somnath当前位置我真的认为默认的文化不适合我们。记录它:
Logger.TraceLog(LogLevel.Debug,string.Format(“区域性:{0}”,CultureInfo.CurrentCulture))。在美国文化中,您希望将什么可能的
double
值格式化为
3,22
?我将其记录为Logger.TraceLog(LogLevel.Debug,string.Format(“当前文化:-{0},解析后:-{1}”,System.Globalization.CultureInfo.currentuicure,user.DiskUsage)),在日志文件Current culture:-en.US中,解析后:-3,22我想在美国将其格式化为3.22。