在另一台计算机上将文本转换为双精度失败

m.r*_*226 2 c# double type-conversion

我在我的电脑上运行这部分代码。系统操作系统是Windows 10 Enterprise。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

static void Main(string[] args)
{
    string text_double = "0.7598";
    string message = "Using double.Parse():   ";
    try
    {
        double confidence = double.Parse(text_double);
        message += text_double + " Converted To " + confidence;
    }
    catch (Exception ex)
    {
        message += ex.Message;
    }
    Console.WriteLine(message);

    message = "Using Convert.ToDouble:   ";
    try
    {
        double confidence = Convert.ToDouble(text_double);
        message += text_double + " Converted To " + confidence;
    }
    catch (Exception ex)
    {
        message += ex.Message;
    }

    Console.WriteLine(message);
    Console.ReadKey();
    return;
}
Run Code Online (Sandbox Code Playgroud)

在我的 PC 上运行可执行文件会返回预期结果:

Using double.Parse():   0.7598 Converted To 0.7598
Using Convert.ToDouble:   0.7598 Converted To 0.7598
Run Code Online (Sandbox Code Playgroud)

但是当我在运行 Win Server 2012 DataCenter 的另一台计算机上运行可执行文件时,它总是返回错误,如下所示:

Using double.Parse():   input string was not in a correct format
Using Convert.ToDouble:   input string was not in a correct format
Run Code Online (Sandbox Code Playgroud)

我的 Windows 服务器出了什么问题?

[添加]:

我从评论中意识到我的 Windows 服务器具有不同的文化,但当需要在另一台 PC 上运行时我不想更改我的代码。可能还有其他具有不同文化的 PC。

有没有独立的文化?

小智 6

问题出在某些国家/地区的其他计算机文化设置中,小数点分隔符不是“。” 但是“,”这就是抛出异常的原因。

CultureInfo.InvariantCulture解决办法就是解析值的时候pass

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;

static void Main(string[] args)
{
    string text_double = "0.7598";
    string message = "Using double.Parse():   ";
    try
    {
        double confidence = double.Parse(text_double, CultureInfo.InvariantCulture);
        message += text_double + " Converted To " + confidence;
    }
    catch (Exception ex)
    {
        message += ex.Message;
    }
    Console.WriteLine(message);

    message = "Using Convert.ToDouble:   ";
    try
    {
        double confidence = Convert.ToDouble(text_double, CultureInfo.InvariantCulture);
        message += text_double + " Converted To " + confidence;
    }
    catch (Exception ex)
    {
        message += ex.Message;
    }

    Console.WriteLine(message);
    Console.ReadKey();
    return;
}
Run Code Online (Sandbox Code Playgroud)

参考MSDN文档:Double.Parse方法,Convert.ToDouble方法