【问题标题】:CompareValidator currency check does not work with French formatted numbersCompareValidator 货币检查不适用于法语格式的数字
【发布时间】:2010-10-08 16:19:04
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: asp.net culture comparevalidator


    【解决方案1】:

    我也遇到过和你一样的问题,但不完全一样,我有这样的情况:

    <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”

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

    货币格式检查在 BaseCompareValidator 类的方法中 private static string ConvertCurrency(string text, NumberFormatInfo info)

    在代码中有这样一行:

    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";

    【讨论】:

      【解决方案2】:

      我猜这只是 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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-03-23
        • 1970-01-01
        • 2011-01-23
        • 1970-01-01
        • 2020-09-16
        • 2021-05-05
        • 2019-06-29
        • 2015-01-11
        相关资源
        最近更新 更多