0

我目前正在为欧洲的一家公司开发一个计算程序。他们使用公制,默认使用“,”作为十进制符号。

我的程序计算不同的东西,其中一些计算是由 C#/WPF 中文本框的 TextChanged 事件触发的。一切都很好,直到几天前,当用户抱怨在一些计算中没有发生任何事情时,他在文本框中输入了一个数字。结果框中没有错误或没有任何结果(对于某些计算)。我发现由于某种原因没有显示默认值(由我设置)“0,05”的文本框,该框是空白的。但再往下,显示“0,5”的值(也是我设置的)。我对此感到非常困惑,并开始调试并寻找发生这种情况的可能原因,但一无所获。过了一会儿,我意识到他已经将区域和语言下的“十进制符号”从“,”更改为 至 ”。”。这样做是为了使来自美国的程序能够工作,因为如果不这样做,该程序会在启动时崩溃!所以我有了它,把它改回来,一切都很好。但这不是所希望的,因为用户不希望使用此设置来回切换,因此我需要为此找到解决方案。

我在“PreviewTextInput”中有一个方法,它是为了确保它是一个数字并且只包含一个小数分隔符而创建的。我不明白这怎么可能是它的原因,或者你呢?

private void CheckIsNumeric(TextCompositionEventArgs e, object sender)
    {
        int result;

        if (!(int.TryParse(e.Text, out result) || e.Text == ","))
        {
            e.Handled = true;
        }
        if (e.Text == "," && (sender as TextBox).Text.IndexOf(',') > -1)
            e.Handled = true;

    }

为什么启动时出现值“0,5”但“0,05”被“删除”并且很可能是把它搞砸的那个?有没有办法解决这个问题,我需要一些新的想法,因为我目前一直在想根据地区和语言来改变我的程序中的某些内容。

任何帮助表示赞赏。

更新:

如果我将区域和语言“格式”中的设置从瑞典语更改为英语,则无论哪种方式都可以使用“十进制符号”。如果我将其设置为“,”或“。”,程序的行为方式相同。为什么使用瑞典语并带有“。”时不起作用 价值?

4

1 回答 1

0

我会做这样的事情:

string[] numbers = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" };

// check numbers.
if(numbers.Contains(e.Text))
{
    e.Handled = true;
    return;
}

// check separator only occurs ones.
if(e.Text == ",")
{
    e.Handled = (((TextBox)sender).Text.IndexOf(',') == -1);
    return;
}

鉴于 e.Text 是输入的字符。如果 e.Text 是完整的文本,您可以尝试使用:

double result;

// any fixed culture that uses a , as decimal separator.
CultureInfo cultureInfo = new CultureInfo("nl-NL");

e.Handled = double.TryParse(e.Text, NumberStyles.Float, cultureInfo, out result);
于 2013-08-27T08:26:07.517 回答