2009-04-15 4 views
31

Ich versuche, nicht das ',' char als tausend Trennzeichen beim Anzeigen einer Zeichenfolge, sondern stattdessen ein Leerzeichen zu verwenden. Ich denke, ich muss eine eigene Kultur definieren, aber ich finde es nicht richtig. Irgendwelche Zeiger?Verwenden Sie eine benutzerdefinierte tausend Trennzeichen in C#

zB: Anzeige 1000000 als 1 000 000 anstelle von 1.000.000

(nein, String.Replace() ist nicht die Lösung, die ich verwenden möchte: P)

+0

Was ist falsch mit String.Replace()? –

+1

@ Jon B - weil Ersetzen nicht kulturunabhängig wäre. Was ist, wenn Sie auf einem Computer laufen, wo die tausend Sep ist. ? –

+0

und da ich bereits die Nummer formatiere, würde es den Code überladen – Luk

Antwort

63

Ich schlage vor, Sie NumberFormatInfo finden, die am ehesten entspricht was Sie wollen (dh es ist abgesehen von dem Tausendertrennzeichen richtig), rufen Sie Clone() darauf an und stellen Sie dann die NumberGroupSeparator Eigenschaft ein. (Wenn Sie die Zahlen mit Währungsformaten formatieren, müssen Sie stattdessen auch CurrencyGroupSeparator ändern.) Verwenden Sie das als Format-Info für Ihre Anrufe an string.Format usw., und Sie sollten in Ordnung sein. Zum Beispiel:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     NumberFormatInfo nfi = (NumberFormatInfo) 
      CultureInfo.InvariantCulture.NumberFormat.Clone(); 
     nfi.NumberGroupSeparator = " "; 

     Console.WriteLine(12345.ToString("n", nfi)); // 12 345.00 
    } 
} 
+0

@Jon: Du bist so schnell ... aber normalerweise auf den Punkt und genau. – Lucero

+0

Dass Skeet-Marke LoadBalancer Routingprobleme hat? –

+0

Wow, Danke Jon! – Luk

1

Der einfachste Weg, ...

num.ToString("### ### ### ### ##0.00") 
+5

Obwohl das funktioniert, wird es tatsächlich Leerzeichen vor der Nummer erzeugen. Zum Beispiel hätte die Zahl 1 4 Leerzeichen davor. Also musst du es zumindest schneiden. Ich denke, die beste Lösung ist, die NumberFormatInfo anzupassen, wenn Sie das Culture-Standardformat überschreiben möchten. – Johncl

4

Es ist eine etwas einfachere Version von Jon Skeet ein:

using System; 
using System.Globalization; 

class Test 
{ 
    static void Main() 
    { 
     NumberFormatInfo nfi = new NumberFormatInfo {NumberGroupSeparator = " ", NumberDecimalDigits = 0}; 

     Console.WriteLine(12345678.ToString("n", nfi)); // 12 345 678 
    } 
} 

Und die 'NFI' Initialisierung übersprungen werden kann und direkt als Parameter in die ToString setzen() Methode.

+0

Das ist im Grunde John Skeets Antwort neu geschrieben. Nicht gerade kreativ oder kürzer! –