C# “问题”;十进制符号;,用于计算程序的in区域和语言

C# “问题”;十进制符号;,用于计算程序的in区域和语言,c#,wpf,numeric,textchanged,C#,Wpf,Numeric,Textchanged,我目前正在为欧洲的一家公司开发一个计算程序。他们使用公制,默认情况下,“,”作为十进制符号 我的程序计算不同的内容,其中一些计算是由C#/WPF中文本框中的TextChanged事件触发的。直到几天前,一位用户抱怨说,在一些计算中,当他在文本框中键入一个数字时,什么也没发生,所有这些都正常工作。没有错误或什么都没有,只是结果框中没有结果(对于某些计算)。我发现由于某种原因,默认值(由我设置)“0,05”的文本框未显示,该框为空。但再往下看是“0,5”的值(也是我设定的)。我对此感到非常困惑,并开

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

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

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

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”会被“删除”,而且最有可能的是会把一切搞砸的值? 有没有办法解决这个问题,我需要一些新的想法,因为我现在一直想根据地区和语言来改变程序中的某些内容

感谢您的帮助

更新:


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

我会这样做:

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);

为什么要使用int.tryparse?因为我希望该方法进行检查,以便它是一个有效的数字,关于检查,因此只有一个十进制分隔符。你的意思是说我不应该使用double.TryParse(text,NumberStyles.Float,CultureInfo.CurrentCulture,out result)@user1176296
int.TryParse
如果有小数点,将返回false。无论如何-如果您的任何代码在浮点解析过程中明确提到了
,那么您就做错了。这可能是一种很好的替代方法,但它并没有解决问题,任何更改仍然对键入时没有更新的主问题没有任何作用。文本框中仍然缺少“0,05”,即使存在“0,5”,它们也有相同的连接方法。我认为问题超出了这个方法。是的,这里也一样。我只是不明白为什么程序会从文本框中“删除”一个值“0,05”,但在启动时留下一个值“0,5”?也许我可以通过将“.”替换为“.”来解决这个问题,但是当出现“错误”时,用户甚至还没有开始使用这个程序。是否涉及到验证程序/最大长度?