我有一个 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(".", ","));