我有一个薪水TextBox和一个相关的CompareValidator,其设置如下:
<asp:CompareValidator ... Operator="DataTypeCheck" Type="Currency" />
我在TextBox中填充了数据库中的格式化字符串:
txtSalary.Text = myObject.Salary.ToString("N2")
当用户使用法国文化(例如fr-ca)访问页面时,ToString方法会将80 000,00
放入文本框中,这很好。
但是,任何带有空格的数字都会导致验证器失败,这不是很好。有没有办法让CompareValidator与非美国格式的数字一起正常工作?
答案 0 :(得分:2)
我有像你这样的问题,但不完全一样,我有这样的事情:
<asp:RangeValidator ID="rw" ErrorMessage="error"
Text="!" ControlToValidate="r" MinimumValue="1 000,00" MaximumValue="1 000 000,00" Type="Currency" CultureInvariantValues="false" runat="server" EnableClientScript="true" />;
我使用数据(例如2 000,00)对我的控件进行数据绑定,并且我有验证错误
但是当我输入值2 000,00时,一切都还可以。
答案是CurrencyGroupSeparator中的空格,我的文化pl-pl中有空格,但它不是空格“\ x0020”,但它是非破坏空间“\ 00A0”
我用反射器做了一些挖掘,我发现的是令人费解的
货币格式检查在方法的BaseCompareValidator类中 private static string ConvertCurrency(string text,NumberFormatInfo info)
在代码中有一行如下:
if (currencyGroupSeparator[0] == '\x00a0')
{
currencyGroupSeparator = " ";
}
我在测试项目中推出了反编译代码并尝试运行它,实际上代码运行不正常。
ConvertCurrency(10000000.00m.ToString(“n”),NumberFormatInfo.CurrentInfo) 返回null;
为什么有人把它放在那里我不知道,但后来我评论说,方法已经开始正常工作了。
我们无法从源代码编译.net框架,所以我们可以做的是将分隔符从非破坏空间更改为空格
所以问题的解决方案是:
Thread.CurrentThread.CurrentCulture = new CultureInfo(“一些文化 名称”); 的 Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyGroupSeparator =“\ x0020”; Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator =“\ x0020”;
答案 1 :(得分:0)
我想这只是CompareValidator和RangeValidator的一个错误 - 可能在客户端JavaScript上。
我通过更改为CustomValidator来解决问题,在服务器端使用以下代码(并且客户端没有代码):
Protected Sub ValidateSalary(ByVal sender As Object, _
ByVal e As ServerValidateEventArgs)
Try
If txtSalary.Text <> String.Empty Then
Dim salary As Decimal = Convert.ToDecimal(txtSalary.Text, _
Thread.CurrentThread.CurrentUICulture)
End If
e.IsValid = True
Catch ex As Exception
e.IsValid = False
End Try
End Sub