2009-10-13 19 views

risposta

28

penso:

string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", 4.3); 

dovrebbe fare quello che vuoi.

+3

si prenderà cura di gestire anche migliaia, che sono anche diversi. – dove

+3

Ma ha lo svantaggio che devi inserire manualmente le informazioni sulla cultura in OGNI metodo ToString, String.Format, Number.Parse e simile nel tuo codice. – Foxfire

+0

È utile per un caso specifico ma non consente di specificare il punto decimale. –

2

La formattazione del numero di default utilizza NumberFormatInfo dall'attuale CultureInfo, in modo che venga visualizzato utilizzando le impostazioni internazionali sul computer.

Pertanto, non è necessario fare nulla di speciale, ad eccezione forse assicurandosi che venga utilizzato il corretto CultureInfo.

Per quanto riguarda la domanda, sì, la stringa non è valida. Un "," indica un separatore di migliaia, non il separatore decimale. Dai un'occhiata a NumberFormatInfo e allo custom number formats.

3

Per una soluzione più generale, è possibile set the thread's UI culture per la cultura utilizzata dai vostri amici europei. Questo influenzerà la presentazione dei numeri, valuta, date, ecc

1

Utilizzare un CultureInfo che ha le virgole invece di punto decimale (francese per esempio):

string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3); 
30
NumberFormatInfo nfi = new NumberFormatInfo(); 
nfi.NumberDecimalSeparator = ","; 
nfi.NumberGroupSeparator = "."; 

double num = 4.3; 
string ret = num.ToString(nfi); // 4,3 
+1

@James: tranne che è abbastanza inutile dal momento che il supporto per la cultura è incorporato in .NET. Meglio fare questo il modo supportato piuttosto che reinventarlo. –

+2

@Mats: E cosa succede se decidi di scegliere un oggetto europeo CultureInfo' arbitrario (ad esempio, "de-DE" o "fr-FR") e che la cultura è stata personalizzata per utilizzare un separatore decimale diverso? So che è uno scenario improbabile ma potrebbe accadere. Usando il mio codice otterrete sempre un ',' come separatore decimale, indipendentemente da eventuali personalizzazioni. – LukeH

+0

Ma non si vuole ottenere un ',' sempre, si desidera formattare le stringhe in base alle impostazioni regionali dell'utente (incluse le sue impostazioni personalizzate). – Groo

9

Questo dipende da ciò che si vuole fare. Se si vuole rendere la vostra intera applicazione pronta per qualche altra uscita lingua basta usare

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("de-DE"); 

Se si desidera avere una domanda di lingua mista (che significa alcune delle uscite vengono formattati in una lingua un po 'in un altro) si ha di utilizzare i sovraccarichi delle specifiche funzioni di stringa del tipo:

var culture = System.Globalization.CultureInfo.GetCultureInfo("de-DE"); 
String.Format (culture, "{0:0.0}", 4.3); 

Il primo metodo è preferibile se è possibile, perché hai solo bisogno di una sola riga nella vostra applicazione e tutto sarà come previsto. Nel secondo devi aggiungere il parametro cultura ad ogni metodo di uscita String nell'intera applicazione.

+0

Questa è un'ottima risposta. Sai se questo è impostabile tramite un file di configurazione? – Greg

+0

@Greg *** sezione di globalizzazione *** in ASP.NET, non in WinForms, app console, penso. – Kiquenet

1

Sì, si sta utilizzando la stringa errata e inoltre il problema non può essere risolto fornendo solo una stringa di formattazione.

Che cosa fa la stringa di formattazione è quello di formattare il numero utilizzando il modello "0", quindi allineato alla lunghezza 0.

Quando si specifica il separatore decimale in una stringa di formattazione, è sempre un periodo indipendentemente dalla cultura corrente. Il separatore decimale nel risultato della formattazione d'altra parte è sempre quello usato dalla cultura corrente. Quindi, per ottenere una virgola come separatore decimale nel risultato, è necessario assicurarsi che la cultura utilizzata per la formattazione sia quella che utilizza la virgola come separatore decimale.

è possibile impostare la lingua corrente per il thread in modo che sia utilizzato di default per la formattazione, o specificare una cultura nella chiamata:

string ret = String.Format(CultureInfo.GetCultureInfo(1053), "{0:0.0}", 4.3); 
0

Impostazioni cultura filo farà questa conversione automaticamente. Tuttavia, se si desidera formattare questo con una stringa personalizzata è possibile effettuare le seguenti operazioni:

string ret = string.Format("{0:0.00}", 4.3); 

o

string ret = (4.3f).ToString("0.00"); 

Il "" è l'identificatore di formato per il punto decimale per la cultura corrente. Maggiori informazioni per i formati numerici personalizzati sono disponibili all'indirizzo: http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

È sempre possibile verificare il carattere per il punto decimale è con:

string decimalChar = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator; 
0

Numero formattazione può essere gestito per voi dal quadro se si utilizza la corretta culture durante la manipolazione del numero.

Console.WriteLine(4.3); 

Console.WriteLine(4.3.ToString(CultureInfo.GetCultureInfo("fr-fr"))); 

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr"); 
Console.WriteLine(4.3); 

Se si desidera eseguire una visualizzazione "una tantum", il secondo approccio funzionerà. Se vuoi visualizzare correttamente tutti i numeri, dovresti impostare lo current thread's culture. In questo modo, qualsiasi manipolazione di numeri gestirà i separatori decimali, raggruppando i caratteri e qualsiasi altra cosa specifica della cultura correttamente.

Lo stesso vale per i numeri di analisi. Se un utente immette 1,234, come si fa a sapere se è stato immesso 1.234 (la virgola è il separatore decimale) o 1234 (la virgola è un separatore di raggruppamento)? Questo è dove la cultura aiuta in quanto sa come visualizzare i numeri e può anche essere utilizzato per analizzare in modo corretto:

Console.WriteLine(double.Parse("1,234")); 

Console.WriteLine(double.Parse("1,234", CultureInfo.GetCultureInfo("fr-fr"))); 

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr"); 
Console.WriteLine(double.Parse("1,234")); 

È possibile che questo testamento uscita 1234 (la virgola è un separatore decimale nel mio it-it cultura di default), 1.234 (la virgola è un separatore decimale in francese) e 1,234 (di nuovo, la virgola è un separatore decimale in francese, e anche la cultura del thread è impostata su French in modo da visualizzare utilizzando questa cultura - da cui la virgola come separatore decimale nell'output).