我目前正在为欧洲的一家公司开发计算程序。他们使用公制系统,默认为“,”作为小数符号。
我的程序计算不同的东西,一些计算是由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”被“删除”,而且最有可能是乱搞它的那个? 有没有办法解决这个问题,我需要一些新的想法,因为我目前在脑海中考虑根据地区和语言改变程序中的某些内容。
感谢任何帮助。
更新
如果我将区域和语言“格式”中的设置从瑞典语更改为英语,则无论哪种方式都可以使用“十进制符号”。如果我将它设置为“,”或“。”,程序的行为方式相同。为什么它在使用瑞典语并且具有“。”时不起作用。值?
答案 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);