如何将字符串转换为双精度时检测 Windows 版本以解决"",""或"



我不得不使用 Windows 窗体在 C# 中制作一个数字键盘,该窗体接受并验证doubleint值,但用于doublestring格式在 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));

其中Tintdouble.如果我尝试在字符串中使用作为小数分隔符,例如"2.2",Windows 7 将返回double22,但它在 Windows 10(double2.2)中工作正常。如果我使用逗号,Win7 将返回预期的内容,但随后 Win 10 返回 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();
}

相关内容