2009-04-06 12 views
17

Questo mi sta facendo impazzire. Ho la seguente stringa in una pagina WebForm ASP.NET 2.0Double.Parse - Internationalization problem

string s = "0.009"; 

Abbastanza semplice. Ora, se la mia cultura è lo spagnolo - che è "es-ES" - e cerco di convertire la stringa in doppio, mi effettuare le seguenti operazioni:

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

quello che mi aspetto è 0,009. Invece, ottengo 9. Capisco che .NET pensi che sia un separatore di migliaia, che in en-US è una virgola, ma non dovrebbe prendere le informazioni sulla cultura che sto passando al metodo di analisi e applicare il formato corretto a la conversione?

Se faccio

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

formattato è ora 0,009. Chiunque?

+1

Maggiori informazioni su questo e molti altri problemi con la localizzazione come su http://www.moserware.com/2008/02/does-your-code-pass-turkey-test.html –

risposta

20

E è prendendo la cultura che hai dato e applicando la formattazione corretta. Hai fornito una stringa di "0,009" e gli hai detto che era spagnolo ... quindi ti lamenti che lo interpretasse correttamente come spagnolo! Non dire che la stringa è spagnola quando sai che non lo è.

È necessario passare il metodo Parse alla cultura della stringa da analizzare, che in questo caso sarebbe en-US o en-Gb o InvariantCulture.

+0

sì, ho sbagliato tutto. Grazie ragazzi per le risposte. È stato davvero utile –

+0

Nessun problema. Sono sempre felice di aiutare. Scusa se la mia risposta si è rivelata un po 'tagliente - non era intesa in quel modo ma rileggendola ora, si legge come se fossi un vero idiota. –

4

Avete indietro.

Quando dici double d = Double.Parse(s, new CultureInfo("es-ES"));, stai chiedendo a .NET di analizzare la tua stringa in un doppio, assumendo che la stringa sia scritta nella cultura es-ES.

Nella cultura spagnola, "." è un separatore di migliaia, quindi "0,009" è 9.

Quando converti usando ToString(), alla fine, si dice convertito 0,009 in una stringa usando la cultura spagnola, quindi usa "," come separatore decimale e ottieni "0,009". Il comportamento è corretto

La mia ipotesi è che si desidera utilizzare Double.Parse con la cultura invariante e ToString con la cultura spagnola, quindi 0,009 diventa 0,009.

2

Si sta confondendo l'analisi e la formattazione. Ottenete 9 invece di 0,009 la prima volta perché prendete una stringa formata in una cultura basata su. E la analizzate utilizzando una cultura basata su. È necessario analizzarlo utilizzando qualsiasi cultura con cui è stato creato e quindi formattarlo utilizzando qualsiasi cultura desideri per la visualizzazione.

3

Penso che lo stiate interpretando nel modo sbagliato, nella cultura es-ES 0.009 è davvero solo un lungo modo di dire 9, come "." non è il separatore decimale, quindi se chiedete che la stringa "0.009" sia analizzata con con la cultura es-ES, dovreste in effetti ottenere il valore deouble 9.0. Se chiedete di analizzare "0,009" dovreste ottenere un doppio di 0,009.

Analogamente, se lo si chiede al formato il doppio 0,009 si dovrebbe ottenere la stringa "0,009" in es-ES.

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

Nella cultura es-ES "" è un seporator decimale (non "")

10

ciò che la scrittura di Jess funziona per me.solo per tutti coloro che avevo bisogno di provare come ottenere "cultura invarianti": sembra questo

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

(primo post StackOverflow, così sì, piuttosto marginale;)