2010-10-06 6 views
12

Ho un metodo che restituisce numeri come questo:C# separatore decimale?

public decimal GetNumber() 
{ 
    return 250.00m; 
} 

Ora, quando questo valore è stampato sulla console, per esempio, ha una virgola (250,00) invece di un punto (250,00). Voglio sempre un punto qui, cosa sto sbagliando?

+6

Se non si conosce: ',' ​​viene utilizzato come separatore decimale in molti paesi europei, come Germania, Francia e Italia. Forse hai la tua cultura impostata su uno di questi posti? –

+0

Ho testato questa funzione in un'applicazione console e funziona per me. Viene visualizzato con il punto (250,00). –

risposta

48

decimal non ha una formattazione - non ha né una virgola né un punto.

È quando lo converti in una stringa che otterrai questo. Si può essere sicuri di ottenere un punto specificando la cultura invarianti:

using System; 
using System.Globalization; 
using System.Threading; 

class Test 
{ 
    static void Main() 
    { 
     Thread.CurrentThread.CurrentCulture = new CultureInfo("fr-FR"); 
     decimal d = 5.50m; 
     string withComma = d.ToString(); 
     string withDot = d.ToString(CultureInfo.InvariantCulture); 
     Console.WriteLine(withComma); 
     Console.WriteLine(withDot); 
    } 
} 
+1

System.Globalization.CultureInfo germanCultureInfo = new System.Globalization.CultureInfo ("de-DE"); decimale d = 0,3 m; string s1 = d.ToString (germanCultureInfo); -> s1 è 0,3 non 0,3. Perché? – Offler

+1

@Offler: Non riesco a riprodurlo - quel codice * esatto * mi dà "0,3". –

+1

È accaduto su una macchina del cliente. Cercavo in Internet per scoprire perché ... La soluzione ora è stata trovata sul PC dei clienti - Impostazioni di Windows dove sono state cambiate. – Offler

1

Formattazione specifica per locale?

http://en.wikipedia.org/wiki/File:DecimalSeparator.svg (Il verde equivale a una virgola, quindi se si sta chiamando ToString() sul proprio decimale utilizzando le informazioni sulla cultura di una di queste posizioni, verrà visualizzata una virgola).

6

Come spiegato da Jon Skeet, è necessario specificare la cultura utilizzato per formattare il string:

var str = GetNumber().ToString(System.Globalization.CultureInfo.InvariantCulture); 

E 'una buona pratica utilizzare sempre il sovraccarico ToString in cui si specifica la cultura. In caso contrario, .NET utilizzare il thread corrente Culture, che avrebbe scritto diverso strings all'uscita in base alle impostazioni internazionali del PC ...

+1

... d'altra parte potrebbe anche essere che usando l'attuale locale sul PC (dato che non stiamo parlando di applicazioni web) è il comportamento preferito. Dopotutto sarebbe quello che l'utente è abituato a vedere. –

+2

Sì, sono d'accordo con te. È un comportamento valido quando la stringa verrà utilizzata nell'interfaccia utente. Ma può essere un problema reale quando la stringa viene utilizzata per eseguire una sorta di serializzazione.In questo caso, la deserializzazione potrebbe non riuscire a seconda delle impostazioni locali del PC in esecuzione ... E questo non verrà visualizzato prima che il prodotto venga spedito su una piattaforma con impostazioni internazionali diverse. Preferisco prendermi qualche secondo per pensarci (e prendere una decisione ragionevole a riguardo) piuttosto che rimpiangerlo in seguito. – Eilistraee

0

Ho verificato con Visual Studio 2008 (applicazione di console) e la sua non mostrare "" invece di "." , si prega di fornire maggiori dettagli. Penso che sia un problema di cultura-informazione. Si prega di fornire ulteriori dettagli del codice

class Program 
{ 
    static void Main(string[] args) 
    { 
     Console.Write(GetNumber()); 
    } 
    public static decimal GetNumber() 
    { 
     return 250.00m; 
    } 

}