2009-04-03 12 views
2

J'ai une zone de texte acceptant l'entrée de l'utilisateur; Je suis en train d'utiliser cette entrée utilisateur pour remplir ce membre d'un de mes objets métier:ASP.NET - Conversion du numéro localisé

public System.Decimal? ExchangeRate

L'application est localisée - Je dois soutenir les cultures même temps, qui acceptent ces comme entrées valides: « 1 , 5" et "1,5"

le code que j'ai maintenant:

 
var culture = Thread.CurrentThread.CurrentUICulture; 

int exchangeRate; 
int.TryParse(txtExchangeRate.Text, NumberStyles.Number, culture, 
    out exchangeRate); 

entity.ExchangeRate = exchangeRate; 

Lorsque la culture de l'utilisateur est défini sur une culture qui attend le "format 1,5" (la virgule comme séparateur décimal) - par exemple "ro-RO", je veux que la valeur qui est stockée dans entity.ExchangeRate soit 1.5; Toutefois, lors de l'exécution du code ci-dessus, il est converti en 15 à la place.

Des suggestions sur la façon de convertir ces différents formats afin que les données qui sont stockées dans mon entité commerciale soient "1.5" (point comme séparateur décimal)?

Merci.


gars vous aviez raison - il était logique d'utiliser Thread.CurrentThread.CurrentCulture au lieu de Thread.CurrentThread.CurrentUICulture et decimal.TryParse au lieu de int.TryParse.

Mais ces changements ne résoudraient toujours pas mon problème. Et après avoir joué avec le code un peu plus, je peux maintenant simplifier le problème à ceci:

J'utilise un contrôle telerik RadNumericTextBox qui oblige les utilisateurs à utiliser le format correct en fonction de leur culture. Ainsi, lorsque Thread.CurrentThread.CurrentCulture est défini sur "ro-RO", il n'accepte que le format "1,5" et lorsqu'il est défini sur "en-GB", il n'accepte que le format "1.5".

Voici le code que je suis maintenant en utilisant:

 
decimal exchangeRate; 
decimal.TryParse(txtExchangeRate.Text, out exchangeRate); 
entity.ExchangeRate = exchangeRate; 

Cas 1: la culture actuelle est "en-GB" - entrée est acceptée "1,5", ExchangeRate est réglé sur 1,5 - tout fonctionne bien. Cas 2: la culture actuelle est "ro-RO" - entrée acceptée est "1,5", mais après l'exécution de la ligne decimal.TryParse ..., exchangeRate est fixé à 15 - faux, évidemment. Je devrais également mentionner que dans ce cas, la valeur de txtExchangeRate.Text est également montrée comme "1.5" dans ma fenêtre de surveillance. Donc, il ressemble à decimal.TryParse prendra en considération la culture actuelle, mais je ne peux pas trouver un moyen de le faire fonctionner correctement pour moi. Aucune suggestion?

+0

Vous ne devriez pas utiliser decimal et decimal.TryParse? Il devrait revenir en tant que 1, pas 15 lorsque vous analyser comme un int puisque la partie décimale serait tronquée. – tvanfosson

+0

@tvanfosson: Cela devrait être une réponse – cjk

Répondre

2

OK, voici le code qui semble fonctionner sur les deux cas, j'ai décrit dans mon post ci-dessus (1 culture "ro-RO", la virgule comme séparateur décimal et 2. la culture "en-GB", point en tant que séparateur décimal):

 
decimal exchangeRate; 
decimal.TryParse(txtExchangeRate.Text, NumberStyles.Any, 
     CultureInfo.InvariantCulture, out exchangeRate); 
entity.ExchangeRate = exchangeRate; 
+0

Ne fonctionne pas - 1,5 est analysé comme 15. – Dunc

0

Vous devriez probablement utiliser CurrentCulture (par opposition à CurrentUICulture) pour la localisation (par exemple la mise en forme de la date et du nombre).

+0

Non, je reçois toujours les mêmes résultats en utilisant CurrentCulture ("35" au lieu de "3.5"). –

1

Pour votre information, je sais que ce n'est pas votre problème, mais son un pointeur pour d'autres personnes qui pourraient faire cela:

Lorsque vous définissez votre culture, vous ne pouvez pas avoir votre application capable de gérer l'entrée de différentes cultures. Il doit être du type que vous avez spécifié. Par conséquent, si vous définissez RO-RO comme culture, il ne comprendra pas les deux valeurs 1,5 et 1,5 comme étant identiques.

2
  1. De toute évidence, int ne peut pas contenir 1,5! :-) Utilisez float à la place.

  2. Utilisez CurrentCulture au lieu de CurrentUICulture. Ma culture est fr-BE (donc accepte 1,5 mais mon interface utilisateur Windows est l'anglais, ce qui n'est pas le cas). Je voudrais faire le test float.Parse() avec CurrentCulture et InvariantCulture: Au moment où certains programmes ont appris à accepter "1,5", tout le monde a été utilisé pour taper "1.5". Il n'y a rien qui me dérange plus qu'Excel qui m'oblige à taper 1,5 quand je dis 1.5! Aussi, ici en Belgique, le gouvernement de 1ère année a lancé la déclaration d'impôt sur le Web, le site vous a forcé à utiliser des virgules au lieu de points comme des virgules. Tout le monde se demandait pourquoi les chiffres entrés ont été refusés! Alors soyez gentils avec vos utilisateurs et acceptez les deux.