2010-05-05 3 views
0

J'écris un système bancaire et mon client veut soutenir les normes numériques russes et américaines dans le délimiteur de nombres décimaux. Respectivement . et ,.Analyser les deux symboles. et, comme les nombres décimaux délimitent dans ASP.NET

Maintenant seulement , fonctionne correctement. Peut-être à cause du format OS du serveur web (le russe est défini).

cordes comme 2000.00 lance une FormatException:

chaîne d'entrée était pas dans un format correct.

Comment réparer cela? J'ai deux idées:

protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e) 
{ 
    var txtAmount = (TextBox)((FormView)sender).FindControl("txtAmount")); 
    txtAmount.Text = txtAmount.Text.Replace('.', ','); 
} 

ou

protected void FormView1_ItemInserting(object sender, FormViewInsertEventArgs e) 
{ 
    var ru = new CultureInfo("ru-RU"); 
    var en = new CultureInfo("en-US") 

    decimal d; 
    var txtAmount = (TextBox)((FormView)sender).FindControl("txtAmount")); 
    if (!Decimal.TryParse(value, NumberStyles.Any, ru, out d) 
    && Decimal.TryParse(value, NumberStyles.Any, en, out d) 
    { 
     // data isn't in Russian format but is in American 
     txtAmount.Text = d.ToString(ru); 
    } 
} 

Y at-il d'autres idées?

+1

Voulez-vous vraiment analyser à la fois dans le même contexte? Qu'en est-il des choses comme "£ 2,000,000.45"? –

+0

@ SK-logic: aucun signe de devise par spécification. Mais à propos des deux symboles dans une chaîne d'entrée, je dois penser plus. C'est très rare mais toujours possible. Je pense que ma deuxième variante (et la réponse d'Alex) est l'approche la plus appropriée. – abatishchev

Répondre

3

Vous pouvez essayer d'analyser au format russe et premier (en cas d'échec), puis aux Etats-Unis:

CultureInfo ru = CultureInfo.GetCultureInfo("ru-RU"); 
CultureInfo us = CultureInfo.GetCultureInfo("en-US"); 

string value = "2000,00"; 
decimal result; 
if (!decimal.TryParse(value, NumberStyles.Any, ru, out result)) 
{ 
    if (!decimal.TryParse(value, NumberStyles.Any, us, out result)) 
    { 
     throw new FormatException(); 
    } 
} 

Cela devrait fonctionner pour les deux valeurs 2000,00 et 2000.00.

En outre, la classe AFAIK n'accepte pas NumberFormatInfo plusieurs valeurs pour les séparateurs (par exemple ",." pour NumberDecimalSeparator ou CurrencyDecimalSeparator propriétés). Supposons que String.Replace n'est pas une très bonne idée car la culture US utilise un symbole virgule comme séparateur de groupe (RU utilise l'espace).

+0

Oui, je pensais aussi 'Decimal.TryParse'. Mais gardez à l'esprit - j'insère les données en utilisant 'SqlDataSource' afin qu'il ne soit pas analysé par moi dans le code-behind mais par ASP.NET. J'ai donc besoin de préparer les données pour ne pas analyser – abatishchev

1

Que diriez-vous d'utiliser String.Format pour la devise?

Voici court exemple:

decimal money = 999.99m; 
string html = String.Format("Total: {0:C}", money); 

Informations sur l'utilisation String.Format + culture spécifique peut être trouvée here.

+0

Mon montant est dans un 'asp: TextBox' dans un' asp: FormView' – abatishchev

Questions connexes