2010-11-02 5 views
30

Ho bisogno di convertire un numero decimale in una stringa con N decimali (due o quattro) e NO separatore delle migliaia:Conversione doppio di stringa con N decimali, punto come separatore decimale, e nessun separatore delle migliaia

'XXXXXXX (dot) DDDDD '

Il problema con CultureInfo.InvariantCulture è che è "," separare le migliaia.

UPDATE

Questo dovrebbe funzionare per decimale e tipi doppie.


mia precedente domanda: Need to convert double or decimal to string

risposta

71

Per un decimal, utilizzare il metodo ToString, e specificare la cultura invariante per ottenere un punto come separatore decimale:

value.ToString("0.00", System.Globalization.CultureInfo.InvariantCulture) 

Il tipo long è un intero, quindi non c'è parte frazionaria. Si può solo formattare in una stringa e aggiungere alcuni zeri in seguito:

value.ToString() + ".00" 
+0

Che dire di mille separatori? Cosa lo controlla? –

+0

Per favore dimmi come viene analizzato "0.00" da .NET –

+1

@Captain Comic: ottieni il separatore di migliaia se ad esempio usi il formato "N2", ma non con il formato personalizzato "0.00". Il formato personalizzato "0,00" significa "una o più cifre prima del separatore decimale, il separatore decimale dipendente dalla coltura e esattamente due cifre dopo il separatore decimale". Specificando la cultura invariante si usa il separatore decimale, che è un punto. – Guffa

-2

Si può semplicemente utilizzare Decimal.ToString()

Per due decimali

myDecimal.ToString("0.00"); 

Per quattro decimali

myDecimal.ToString("0.0000"); 

Ciò fornisce punto come separatore decimale e nessun separatore di migliaia indipendentemente dalla coltura.

+12

No, dà il separatore decimale specificato dalla cultura, non sempre periodo. – Guffa

+4

Il '.' nella stringa di formato è un segnaposto per il separatore decimale e non un letterale' .'. Quindi se, ad esempio, la tua cultura è 'fr-FR', il numero verrà visualizzato come 1,23 o 1,2345, ecc. – LukeH

+0

Ho provato a cambiare il carattere decimale in Impostazioni internazionali in Windows in virgola, e si stampa ancora punto e non virgola. Qualche ragione per cui non cambia poi, se è solo un segnaposto? –

21

E 'davvero facile da specificare il proprio separatore decimale. Mi ci sono voluti circa 2 ore per capirlo: D. Hai notato che stavi utilizzando l'attuale cultura di altri che hai specificato giusto? Bene, l'unica cosa di cui ha bisogno il parser è un IFormatProvider. Se gli dai il CultureInfo.CurrentCulture.NumberFormat come formattatore, formatterà il doppio in base allo NumberDecimalSeparator della tua cultura attuale. Quello che ho fatto è stato solo creare una nuova istanza della classe NumberFormatInfo e impostare la sua proprietà NumberDecimalSeparator su qualsiasi stringa di separatore voluta. Completa il codice sottostante:

double value = 2.3d; 
NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = "-"; 
string x = value.ToString(nfi); 

Il risultato? "2-3"

1

Preferisco utilizzare ToString() e IFormatProvider.

double value = 100000.3 
Console.WriteLine(value.ToString("0,0.00", new CultureInfo("en-US", false))); 

uscita: 10,000.30

+1

Ciò causerà problemi. Se si sostituisce il simbolo decimale con una virgola, verrà visualizzato ** 100.000,30 **. Questo perché il costruttore di CultureInfo che stai usando rispetterà le impostazioni dell'utente come il simbolo decimale. Un modo più sicuro è usare sia per CultureInfo.Invariant, oppure si può costruire in questo modo: 'new CultureInfo ("en-US", false)' Passando falso al costruttore dice che non rispettare le personalizzazioni degli utenti . – Carl

1
double valor=3,14159 
string v = valor.Replace(",","."); 
Console.WriteLine(v); 

di uscita: 3.14159

+4

Sì, funziona, no, non è quello che vuoi usare. Cosa succede se hai 1000 torte? valor.Replace (",", "."). Sostituisci (".", ",")? Naah. Se usi CultureInfo, funziona sempre e mantiene il codice leggibile. – increddibelly

-2

Ecco una descrizione dettagliata del formato numerico stringhe
https://msdn.microsoft.com/en-us/library/dwhawy9k(v=vs.110).aspx

Penso che si potrebbe aver usato:
value.ToString (+ NumberOfDecimals "F")

value = 10,502 
value.ToString("F2") //10,50 
value = 10,5 
value.ToString("F2") //10,50 
+2

Il punto della domanda è che l'autore ha bisogno di punti. non la virgola, come separatore decimale. – Filip