将字符串转换为双倍,点被删除
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()。
此致!
从字符串转换为双精度时,点被删除,例如。对于 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()。
此致!