2010-06-28 15 views
35

Vorrei cambiare il punto decimale con un altro carattere in C#. Ho un double variabile valueCome cambiare il simbolo per il punto decimale in double.ToString()?

double value; 

e quando uso il comando:

Console.WriteLine(value.ToString()); // output is 1,25 

So che posso fare questo:

Console.WriteLine(value.ToString(
    CultureInfo.CreateSpecificCulture("en-GB"))); // output is 1.25 

ma non mi piace molto perché è molto lungo e ne ho bisogno abbastanza spesso nel mio programma.

Esiste una versione più breve per impostare "punto decimale" come punto e non come è normale nella mia cultura?

risposta

77

Alcuni collegamenti servono a creare una classe NumberFormatInfo, impostano la proprietà NumberDecimalSeparator su "." e usa la classe come parametro del metodo ToString() ogni volta che ne hai bisogno.

NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = "."; 

value.ToString(nfi); 
+2

Mi piace questo metodo più perché è indipendente dalla lingua! –

15

Forse sto fraintendendo l'intento della tua domanda, quindi correggimi se ho torto, ma non puoi applicare le impostazioni di cultura globalmente una volta, e quindi non preoccuparti di personalizzare ogni istruzione di scrittura?

Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-GB"); 
+0

Bene, non ne ho bisogno in tutto il programma ne ho bisogno per adattarsi al formato di PathGeometry in WPF dove sono previsti i punti decimali. Ma si scopre che questa soluzione non fa male a qualcos'altro. Grazie! –

+0

@ womp Risposta di gran lunga migliore! Questo si applica anche ai sottoprocessi se li ho impostati sul mio thread principale? Vorrei applicare questa impostazione per l'intero periodo di esecuzione del mio assemblaggio. – Bitterblue

32

Creare un metodo di estensione?

Console.WriteLine(value.ToGBString()); 

// ... 

public static class DoubleExtensions 
{ 
    public static string ToGBString(this double value) 
    { 
     return value.ToString(CultureInfo.GetCultureInfo("en-GB")); 
    } 
} 
+0

Forse qualcuno downvoted perché, mentre questo funziona come un fascino, potrebbe essere fatto in un modo più carino, impostando il culturalinfo a livello globale. Btw. non sono il downvoter:) –

+1

@Thomas: Infatti, anche se quando l'OP dice * "Ne ho bisogno abbastanza spesso nel mio programma" *, ho interpretato questo per indicare qualcosa come * "spesso ma non ogni volta" *. – LukeH

14

È possibile modificare il separatore decimale modificando la lingua utilizzata per visualizzare il numero. Fai attenzione però che questo cambierà tutto il resto sul numero (ad esempio, separatore di raggruppamenti, dimensioni di raggruppamento, numero di posizioni decimali). Dalla tua domanda, sembra che tu sia inadempiente a una cultura che usa una virgola come separatore decimale.

Per cambiare solo il separatore decimale, senza cambiare la cultura, è possibile modificare la proprietà NumberDecimalSeparator della corrente cultura NumberFormatInfo.

Thread.CurrentCulture.NumberFormat.NumberDecimalSeparator = "."; 

Questo modificherà la cultura corrente del thread. Tutti gli output saranno ora modificati, il che significa che puoi semplicemente usare value.ToString() per produrre il formato che vuoi, senza preoccuparti di cambiare la cultura ogni volta che generi un numero.

(Si noti che una cultura neutral non può avere il suo separatore decimale cambiato.)

+5

Se si tenta di farlo, si ottiene un errore "Istanza è di sola lettura". –

+0

@MariusStanescu Penso che questo accada solo quando si usa una cultura numerica come adrianbanks annotata alla fine della sua risposta. – patrickbadley

+0

@patrickbadley Ho appena provato questa soluzione e ho riscontrato l'errore di "sola lettura". Aggiungendo "Culture.IsNeutralCulture" in "Watch window" cleary è emerso che la cultura non era neutrale. Tuttavia, ho anche notato che era di sola lettura. La clonazione della cultura sembra essere la soluzione giusta. Vedere la seguente [risposta] (http://stackoverflow.com/a/3912937/4625305). – AXMIM

1

Se si dispone di un'applicazione Web Asp.Net, è anche possibile impostare nel web.config in modo che sia lo stesso per tutta la intera web application

<system.web> 
    ... 
    <globalization 
     requestEncoding="utf-8" 
     responseEncoding="utf-8" 
     culture="en-GB" 
     uiCulture="en-GB" 
     enableClientBasedCulture="false"/> 
    ... 
</system.web>