DevExpress的TextEdit控件上的FormatException无法存储我的十进制值

时间:2013-03-18 13:43:36

标签: c# wpf devexpress decimal textedit

我有一个DevExpress(我将这个问题称为“DX”)控件,TextEdit

这是我所拥有的样本

<Grid>
    <dxe:TextEdit x:Name="te" MaskType="Numeric" Mask="###,##0.###"
                  MaskUseAsDisplayFormat="True" Validate="te_Validate"
                  Text="{Binding myValeur, UpdateSourceTrigger=PropertyChanged}"/>
</Grid>

掩码Mask="###,##0.###"是正常的,我限制为9个数字,小数点后3位。

我在我的代码隐藏

中这样做
decimal myDecimalValue = 0.0m;
private void te_Validate(object sender, DevExpress.Xpf.Editors.ValidationEventArgs e)
{
    Thread Thread_te_Validate = new Thread(delegate()
    {
        this.Dispatcher.BeginInvoke(new Action(delegate()
        {
            if (!String.IsNullOrEmpty(te.Text))
                myDecimalValue = Convert.ToDecimal(te.Text);
        }));
    });
    Thread_te_Validate.IsBackground = true;
    Thread_te_Validate.Start();
}

此代码适用于一个奇怪的问题。如果我在TextEdit中编写100,则会正确转换该值。如果我写100.123(所以我放了一些小数),应用程序崩溃时出现错误FormatException was unhandled by user code (法语转换)

详细说明,我有{"The format of the input string is incorrect."}

崩溃时TextEdit.Text的值很好100.123,但十进制只存储100

我是法国人,并且使用法国文化,因此'逗号'是用户界面的小数分隔符,但变量在小数点分隔符中以'点'正确存储。

修改: 我测试了这段代码并且出现了同样的错误。所以我认为问题是转换为十进制。 string获取带小数的值,但转换错误。

if (!String.IsNullOrEmpty(te.Text))
{ 
    string test1 = te.Text;
    myDecimalValue = Convert.ToDecimal(test1);
}

编辑2: 这段代码也不适合。

if (!String.IsNullOrEmpty(te.Text))
{ 
    string test1 = te.Text;
    myDecimalValue = decimal.Parse(test1);
}

编辑3: 我还尝试在转换期间强制培养。 使用此代码,我无法在TextEdit中插入小数,只能在整数中插入。

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.InvariantCulture);

我的特定文化会发送FormatException错误。

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.CreateSpecificCulture("fr-FR"));

我的中立文化也会发送FormatException错误。

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.CreateSpecificCulture("fr"));

为我工作的解决方案: 这段代码适合我。我在App.xaml中将'Langage'定义为'fr',但显然,它并不足够。所以问题实际上是文化,当然还有十进制字符。

对我而言,我需要用'逗号'代替'点',因为DevExpress中的文化向我展示了良好的文化,但存储在美国文化中。

if (!String.IsNullOrEmpty(myDXTextEdit.Text))
    myDecimalValue = Convert.ToDecimal(myDXTextEdit.Text.Replace(".", ","));

2 个答案:

答案 0 :(得分:0)

默认情况下,无论系统设置如何,WPF都会使用en-US作为文化。我相信你没有覆盖这种行为,而且你已经在TextEdit.Mask中包含了'dot'作为小数分隔符。到现在为止还挺好。这是因为您已收到100.23(带有'点'小数点分隔符)作为值。但是,十进制转换使用您当前的文化(French)作为IFormatProvider,因此您无法使用此文化将文本转换为十进制值(这是异常的原因)。

为避免异常,请指定正确的转换文化(您可以使用InvariantCulture而不是en-US):

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.InvariantCulture);

答案 1 :(得分:0)

经过大量研究后发现存在两个问题。

首先,TextEdit的绑定是在TextEdit修改的变量上创建的,这些变量创建了奇怪的循环,而bug则输入了小数。

其次,即使我的应用程序是在法语文化中定义的,它仍然必须强制String.Replace (".", "")才能正确执行转换。