CompareValidator货币检查不适用于法语格式的数字

时间:2010-10-08 16:19:05

标签: asp.net culture comparevalidator

我有一个薪水TextBox和一个相关的CompareValidator,其设置如下:

<asp:CompareValidator ... Operator="DataTypeCheck" Type="Currency" />

我在TextBox中填充了数据库中的格式化字符串:

txtSalary.Text = myObject.Salary.ToString("N2")

当用户使用法国文化(例如fr-ca)访问页面时,ToString方法会将80 000,00放入文本框中,这很好。

但是,任何带有空格的数字都会导致验证器失败,这不是很好。有没有办法让CompareValidator与非美国格式的数字一起正常工作?

2 个答案:

答案 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