2009-04-06 9 views
17

Cela me rend fou. J'ai la chaîne suivante dans un WebForm ASP.NET 2.0 PageDouble.Parse - Problème d'internationalisation

string s = "0.009"; 

Assez simple. Maintenant, si ma culture est l'espagnol - qui est « es-ES » - et j'essaie de convertir la chaîne en double, je fais ce qui suit:

double d = Double.Parse(s, new CultureInfo("es-ES")); 

ce que je pense est 0009. Au lieu de cela, je comprends 9. Je comprends que .NET pense que c'est un séparateur de milliers, qui dans en-US est une virgule, mais ne devrait pas prendre l'information de culture que je passe à la méthode d'analyse et appliquer le format correct La conversion?

Si je

double d = 0.009D; 
string formatted = d.ToString(new CultureInfo("es-ES")); 

formaté est maintenant 0009. N'importe qui?

+1

Plus de détails à ce sujet et beaucoup d'autres problèmes avec la localisation comme http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

Répondre

20

est en prenant la culture que vous avez donnée et en appliquant la bonne mise en forme. Vous avez fourni une chaîne de "0.009" et lui avez dit que c'était l'espagnol ... alors vous vous plaignez qu'il l'a correctement interprété comme l'espagnol! Ne dites pas que la chaîne est en espagnol quand vous savez que ce n'est pas le cas.

Vous devez passer la méthode Parse à la culture de la chaîne analysée, qui dans ce cas serait en-US ou en-Gb ou InvariantCulture.

+0

oui, j'ai tout faux. Merci les gars pour les réponses. C'était vraiment utile. –

+0

Pas de problème. Je suis toujours heureux d'aider. Désolé si ma réponse a été un peu tranchante - ce n'était pas prévu comme ça mais en la relisant maintenant, ça se lit comme si j'étais un bon gars. –

4

Vous l'avez en arrière. Quand vous dites double d = Double.Parse(s, new CultureInfo("es-ES"));, vous demandez à .NET d'analyser votre chaîne en double, en supposant que la chaîne est écrite dans la culture es-ES.

Dans la culture espagnole, "." Lorsque vous convertissez en utilisant ToString(), à la fin, il dit convertir 0.009 en une chaîne utilisant la culture espagnole, il utilise donc "," comme séparateur décimal. et vous obtenez "0,009". Le comportement est correct. Je pense que vous voulez utiliser Double.Parse avec la culture Invariant, et ToString avec la culture espagnole, alors 0.009 devient 0.009.

2

Vous confondez l'analyse et le formatage. Vous obtenez 9 au lieu de .009 la première fois parce que vous prenez une chaîne qui est formulée dans une culture basée sur. Et l'analyser en utilisant une culture basée sur. Vous devez l'analyser à l'aide de la culture avec laquelle il a été créé, puis le mettre en forme en utilisant la culture que vous souhaitez afficher.

3

Je pense que vous interprétez cela à tort, dans es-ES culture 0.009 est vraiment juste un long chemin de dire 9, comme le "." n'est pas le séparateur décimal, donc si vous demandez que la chaîne "0.009" soit analysée avec la culture es-ES vous devriez en effet obtenir le 9.0 deouble. Si vous lui demandez d'analyser "0,009", vous devriez obtenir un double de 0,009.

De même, si vous le demandez au au format le double 0.009 vous devriez obtenir la chaîne "0,009" dans ES-ES.

1
double d = Double.Parse("0,009", 
    NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, 
    CultureInfo.CreateSpecificCulture("es-ES")); 

Dans la culture es-ES "" est une seporator décimale (non "")

10

ce que l'écriture de Jess travaille pour moi.juste pour tous ceux qui avaient besoin d'essayer comment obtenir la « culture invariante »: il semble cette

double d = Double.Parse(myString, CultureInfo.InvariantCulture);

(premier poste de StackOverflow, donc oui, plutôt marginal;) ​​