2010-10-08 7 views
0

j'ai une zone de texte de salaire et un CompareValidator associé, qui est configuré comme suit:CompareValidator contrôle monétaire ne fonctionne pas avec des chiffres formatés français

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

je remplir la zone de texte avec une chaîne formatée de la base de données:

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

Lorsqu'un utilisateur accède à la page en utilisant une culture française (par exemple fr-ca), la méthode ToString mettra 80 000,00 dans la zone de texte, ce qui est bien. Cependant, tout nombre avec un espace dans celui-ci provoque l'échec du validateur, ce qui n'est pas correct. Est-il possible de faire fonctionner CompareValidator correctement avec des nombres au format non-US?

Répondre

0

Je suppose que c'est juste un bug avec les CompareValidator et RangeValidator - probablement sur le JavaScript côté client.

je résolu le problème en changeant un CustomValidator, avec le code suivant sur le côté serveur (et aucun code du côté client):

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 
2

J'ai eu un problème comme vous, mais pas tout à fait la même, j'avais quelque chose comme ceci:

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

Je DataBound mes contrôles avec des données par exemple 2 et j'avais 000,00 erreur de validation

mais quand je suis entré dans une valeur de 2 000 od , 00 tout allait bien.

la réponse était l'espace dans CurrencyGroupSeparator, ma culture pl-pl a espace, mais il est pas d'espace « \ X0020 », mais il est un espace insécable « \ 00A0 »

Je l'ai utilisé réflecteur faire quelques recherches et ce que je trouve laisse perplexe

chèque format monétaire est en classe BaseCompareValidator dans la méthode chaîne statique privée ConvertCurrency (texte chaîne, informations NumberFormatInfo)

et dans le code il y a une ligne comme celui-ci:

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

J'ai mis du code décompilé dans un projet de test et j'ai essayé de l'exécuter, et en effet le code ne fonctionnait pas correctement.

ConvertCurrency (10000000.00m.ToString ("n"), NumberFormatInfo.CurrentInfo) a renvoyé la valeur null;

pourquoi quelqu'un l'a mis là je ne sais pas, mais alors je l'ai commenté, la méthode ont commencé à fonctionner correctement.

nous ne pouvons pas compiler NET Framework à partir des sources encore, donc ce que nous pouvons faire, est de changer séparateur d'espace insécable à l'espace

donc la solution à notre problème est:

fil. CurrentThread.CurrentCulture = nouveau CultureInfo ("some culture name"); Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyGroupSeparator = "\ x0020"; Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator = "\ x0020";

Questions connexes