C# 如何检测Windows版本以解决'';或'';将字符串转换为双精度时出现问题?

C# 如何检测Windows版本以解决'';或'';将字符串转换为双精度时出现问题?,c#,string,parsing,generics,double,C#,String,Parsing,Generics,Double,我不得不用C#制作一个数字键盘,使用windows窗体接受并验证double和int值,但是string用于double的格式在windows 7和10之间是不同的。这些是我仅有的可供测试的操作系统,我提出了一个过于严格的解决方案。代码如下,如果需要注释,请在注释中询问我。此外,如果问题标题听起来令人困惑或可能更广泛,请随意编辑,我自己也无法想出更好的答案 private static readonly string WIN_10 = "Microsoft Windows NT 6.2.

我不得不用C#制作一个数字键盘,使用windows窗体接受并验证
double
int
值,但是
string
用于
double
的格式在windows 7和10之间是不同的。这些是我仅有的可供测试的操作系统,我提出了一个过于严格的解决方案。代码如下,如果需要注释,请在注释中询问我。此外,如果问题标题听起来令人困惑或可能更广泛,请随意编辑,我自己也无法想出更好的答案

    private static readonly string WIN_10 = "Microsoft Windows NT 6.2.9200.0";
    private static readonly string WIN_7SP1 = "Microsoft Windows NT 6.1.7601 Service Pack 1";

    //(...)

    //Event handler for the comma/dot button:
    private void btDot_Click(object sender, EventArgs e)
    {
        var currentOS = Environment.OSVersion.VersionString;
        //"sb" is a StringBuilder object that holds what's being "typed" in the numpad
        if (sb.ToString().Contains(",") || sb.ToString().Contains(","))
            return;

        if (currentOS == WIN_7SP1)
            sb.Append(",");
        else if (currentOS == WIN_10)
            sb.Append(".");
        tbValue.Text = sb.ToString();
    }

    //(...)
最后,我必须进行以下转换:

returnValue = (T)Convert.ChangeType(sb.ToString(), typeof(T));
其中
T
int
double
。如果我尝试在字符串中使用小数点分隔符,例如“2.2”,Windows 7将返回
double
22,但在Windows 10中工作正常(
double
2.2)。如果我使用逗号,Win7将返回预期值,但Win10将返回22


我想出了上面的解决办法,但有点糟糕。我想知道如何以正确的方式进行操作。

我认为这与版本无关,而是与区域设置有关。请看这里:

固定的:

    private void btDot_Click(object sender, EventArgs e)
    {
        char separator = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);

        if (sb.ToString().Contains(separator))
            return;

        sb.Append(separator);
        tbValue.Text = sb.ToString();
    }

我认为这与版本无关,而是与区域设置有关。请看这里:

固定的:

    private void btDot_Click(object sender, EventArgs e)
    {
        char separator = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);

        if (sb.ToString().Contains(separator))
            return;

        sb.Append(separator);
        tbValue.Text = sb.ToString();
    }

我认为这与版本无关,而是与区域设置有关。看看这里:这两个平台都是英文平台,为什么
CultureInfo.CurrentUICulture.NumberFormat
会彼此不同呢?而且,上面的代码还管用。我会被诅咒的!它确实有效!好的,谢谢,我会把它作为一个回复,并给你学分!我自己加上它作为回答。谢谢我认为这与版本无关,而是与区域设置有关。看看这里:这两个平台都是英文平台,为什么
CultureInfo.CurrentUICulture.NumberFormat
会彼此不同呢?而且,上面的代码还管用。我会被诅咒的!它确实有效!好的,谢谢,我会把它作为一个回复,并给你学分!我自己加上它作为回答。谢谢