Проверка валюты CompareValidator не работает с французскими числами - PullRequest
0 голосов
/ 08 октября 2010

У меня есть зарплата TextBox и связанный CompareValidator, который настроен следующим образом:

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

Я заполняю TextBox отформатированной строкой из базы данных:

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

Когда пользователь заходит на страницу с использованием французской культуры (например, fr-ca), метод ToString помещает 80 000,00 в текстовое поле, что нормально.

Однако любое число с пробелом приводит к сбою валидатора, что недопустимо. Можно ли как-нибудь заставить CompareValidator работать с числами, не отформатированными в США?

Ответы [ 2 ]

2 голосов
/ 02 мая 2011

У меня была такая же проблема, как и у вас, но не совсем, у меня было что-то вроде этого:

<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 в закрытой статической строке методаConvertCurrency (текст строки, информация NumberFormatInfo)

и в коде есть строка, подобная этой:

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

Я вставил декомпилированный код в тестовый проект и попытался запустить его, и действительно, код былне работает должным образом.

ConvertCurrency (10000000.00m.ToString ("n"), NumberFormatInfo.CurrentInfo) возвратил ноль;

почему кто-то положил его туда, я не знаю, но потом я прокомментировалэто ямы начали работать правильно.

мы еще не можем скомпилировать .net framework из исходного кода, поэтому мы можем изменить разделитель с неразрывного пробела на пробел

, чтобы решить нашу проблемуis:

Thread.CurrentThread.CurrentCulture = new CultureInfo ("некоторое название культуры"); Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyGroupSeparator = "\ x0020";Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator = "\ x0020";

0 голосов
/ 15 октября 2010

Полагаю, что это просто ошибка в 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
...