我有一个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(".", ","));
答案 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 (".", "")
才能正确执行转换。