检测十进制分隔符

62

我需要检测当前 Windows 系统设置中的小数分隔符。我正在使用 Visual Studio 2010 和 Windows Form。特别是,如果小数分隔符是逗号,并且用户在文本框1中输入点,则需要在文本框2中显示零。

我尝试了以下代码,但没有起作用:

private void tbxDaConvertire_KeyPress(object sender, KeyPressEventArgs e)
    {
        string uiSep = CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator;
        if (uiSep.Equals(","))
        {
            while (e.KeyChar == (char)46)
            {
                tbxConvertito.Text = "0";
            }
        } 
    }

我也尝试了这段代码,但是它没有起作用:

private void tbxDaConvertire_KeyPress(object sender, KeyPressEventArgs e)
    {
        string uiSep = CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
        if (uiSep.Equals(","))
        {
            if (e.KeyChar == (char)46)
            {
                tbxConvertito.Text = "0";
            }
        } 
    }

2
“但是不起作用”并没有告诉我们出了什么问题。 - Sam Axe
2
由于我们无法读取您的思想或从这里看到您的屏幕,如果您能解释一下“不工作”的含义,那将非常有用。 - Ken White
2
首先,Vincenzolopalo,您不需要 while 循环;其次,您需要更好地解释您的需求。您是说在检查 ==.Equals 时不想要允许“,”吗?一般来说,在比较对象时使用 .Equals 就可以了。总之,您当前的逻辑有缺陷,为什么不使用 Masked Edit 呢? - MethodMan
2
要解决您的问题,只需使用MaskedTextBox <==点击此处 了解更多信息。 - MethodMan
2
这个数字很有意义,它告诉我是1500.00。你是想表示货币吗?你也可以解决这个问题。 - MethodMan
显示剩余4条评论
3个回答

87

解决方案:

private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{
    char a = Convert.ToChar(Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator);
    if (e.KeyChar == a)
    {
        e.Handled = true;
        textBox1.Text = "0";
    }
}

这样,当您按下.,时,您的文本框中将有一个0

编辑:

如果您想在每次按下小数分隔符时插入0,这是代码:

char a = Convert.ToChar(CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator);
if (e.KeyChar == a)
{
    e.KeyChar = '0';
}

如果你需要一个文本框,用户只能输入数字,我有代码。MaskedTextboxes也是一种解决方案,但我不喜欢它们。 - Andres
谢谢Andres,这真的是我需要的解决方案!! :) 但是使用这个完美地工作:CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator - Vincenzo Lo Palo
当然可以!很高兴能帮助你 :) - Andres

43

实际上你应该使用

CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator

代替

CultureInfo.CurrentUICulture.NumberFormat.NumberDecimalSeparator

使用第二个选项会使用操作系统默认设置,这可能与已登录到此计算机的特定用户帐户的区域设置不同。

感谢berhirGrimm指出了[文档]


1
我认为这不正确。这是文档中的说明: “当前区域性是执行线程的属性。检索CultureInfo.CurrentCulture属性的值是检索由Thread.CurrentThread.CurrentCulture属性返回的CultureInfo对象的更高效等效项。” - berhir
berhir 是正确的。文档明确建议使用 CultureInfo:当前区域性是执行线程的属性。当您将此属性设置为表示新区域性的 CultureInfo 对象时,Thread.CurrentThread.CurrentCulture 属性的值也会更改。然而,我们建议您始终使用 CultureInfo.CurrentCulture 属性来检索和设置当前区域性。 - Grimm
这是一段时间之前的事情了,但我想我的意思是不要使用带有 UI 的 CurrentUICulture。但我同意你找到了更高效的方法。感谢你发现了这个问题。 - Bart N

1

我认为你不应该使用 while 循环,它可能会冻结应用程序,应该改用 if,问题可能出在这里。


改变的代码在哪里?在你原来的问题中看起来都一样。 - MethodMan
1
你确定46是点的代码吗?你也可以尝试这个测试:e.KeyChar == '.' - ppetrov
ppetrov 的代码是 = ".",你可以通过以下方式测试它:var somChar = (char)46 - MethodMan
我相信你 @DJ KRAZE,只是没有测试过,认为这样就不会出现字符编码错误。但正如你在之前的评论中所说,代码的主要问题在于 .Equals - ppetrov
不是问题pptrov..但他最初的问题在于几个方面..1使用了一个不需要的While循环,检查“,”他永远找不到,因为他需要检查Key,第三个使用了错误的控件,他应该使用MaskedEdit。 - MethodMan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接