0

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

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

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

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

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

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

4

2 回答 2

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,但我遇到了验证错误

但是当我输入一个值 od 2 000,00 时,一切正常。

答案是 CurrencyGroupSeparator 中的空格,我的文化 pl-pl 中有空格,但不是空格“\x0020”,而是非中断空格“\00A0”

我使用反射器进行了一些挖掘,发现令人费解

货币格式检查在方法私有静态字符串 ConvertCurrency(string text, NumberFormatInfo info) 中的 BaseCompareValidator 类中

在代码中有这样一行:

if (currencyGroupSeparator[0] == '\x00a0')
{
    currencyGroupSeparator = " ";
}

我将反编译的代码放入测试项目并尝试运行它,确实代码无法正常工作。

ConvertCurrency(10000000.00m.ToString("n"), NumberFormatInfo.CurrentInfo) 返回空值;

为什么有人把它放在那里我不知道,但后来我评论了它,方法已经开始正常工作。

我们还不能从源代码编译 .net 框架,所以我们可以做的是将分隔符从非破坏空间更改为空格

所以我们的问题的解决方案是:

Thread.CurrentThread.CurrentCulture = new CultureInfo("一些文化名称"); Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyGroupSeparator = "\x0020"; Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator = "\x0020";

于 2011-05-02T01:37:25.660 回答
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
于 2010-10-15T16:52:38.403 回答