“十进制符号”的问题,在区域和语言中用于计算程序

时间:2013-08-27 08:15:17

标签: c# wpf numeric textchanged

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

我的程序计算不同的东西,一些计算是由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”被“删除”,而且最有可能是乱搞它的那个? 有没有办法解决这个问题,我需要一些新的想法,因为我目前在脑海中考虑根据地区和语言改变程序中的某些内容。

感谢任何帮助。

更新

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

1 个答案:

答案 0 :(得分: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是键入的char。如果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);