1

我有一个 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();
}

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

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

崩溃时 TextEdit.Text 的值很好100.123,但仅存储小数点100

我是法国人,使用法国文化,所以“逗号”是 UI 的小数分隔符,但变量正确存储,小数点分隔符中有一个“点”。

编辑: 我测试了这段代码,同样的错误正在发生。所以我认为问题在于转换为十进制。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 中的“fr”处定义了我的语言,但显然这还不够。所以问题实际上是文化,当然还有十进制字符。

对我来说,我需要用“逗号”替换“点”,因为 DevExpress 中的文化向我展示了良好的文化,但存储在美国文化中。

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

2 回答 2

1

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

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

myDecimalValue = Convert.ToDecimal(te.Text, CultureInfo.InvariantCulture);
于 2013-03-19T08:40:33.987 回答
0

经过大量研究,事实证明存在两个问题。

首先,TextEdit 的绑定是在 TextEdit 修改的变量上进行的,这会产生奇怪的循环和输入小数的错误。

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

于 2013-03-20T14:07:38.470 回答