2013-07-08 5 views
23

Przyjmijmy, mam następującą liczbę dziesiętną, że muszę sformatować tak, że każdy tysiąc powinny być oddzielone spacją:Jak bym oddzielić tysiące z miejsca w C#

897.11 to 897.11 
1897.11 to 1 897.11 
12897.11 to 12 897.11 
123897.11 to 123 897.11 

Próbowałem Decimal.ToString (” 0 000,00 "). Chociaż działa to całkiem dobrze, gdy liczba wynosi 1897.11. Ale kiedy jest 897.11, otrzymuję 0 897.11.

Odpowiedz

46

Przeprowadź niestandardową NumberFormatInfo z niestandardowym NumberGroupSeparator property, a następnie użyj polecenia #,# format, aby poinformować o konieczności grupowania numerów. W tym przykładzie wykorzystano format liczb niezmienniczych kultury jako podstawę.

var nfi = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone(); 
nfi.NumberGroupSeparator = " "; 
string formatted = 1234897.11m.ToString("#,0.00", nfi); // "1 234 897.11" 
+2

+1, Edytowałem tę odpowiedź, aby poprawnie obsługiwać wartości zerowe - poprzedni ciąg formatujący "#, # .00" spowodował zero do przedstawienia jako ".00" teraz wynosi "0.00" – n00b

5

z custom format string, ale użyj '#' nie '0's 0 to obowiązkowy token, który będzie tam bez względu na to, jak długo jest ta liczba, znak funta (#) jest opcjonalnym tokenem, będzie używany tylko dla Cyfry faktycznie w liczbie.

Decimal.ToString("# ###.00") 

UWAGA. Zostawię to tutaj, ale odpowiedź @Tim S 'jest lepsza.

Kiedy próbuję tego, widzę, że generuje tylko pierwszy separator ... Myślę, że separator działa tylko dla przecinków i okresów tutaj. Jako obejście (do maksymalnego oczekiwanego rozmiaru) spróbuj tego.

Decimal.ToString("# ### ### ### ###.00") 
+0

Dla '1234897.11' oznacza to' 1234 897.11' (tj. Oddziela tylko pierwszą grupę). –

+0

@Tim, który brzmi jak błąd w kodzie framework.zobacz moją edycję –

+2

@ Odpowiedź Tin S jest lepsza niż moja. Nie wiedziałem, że 'NumberFormatInfo' istnieje –

4

spróbować

int testNumber = 134566548; 
Console.WriteLine(string.Format("{0:N}", testNumber)); 

Będziesz otrzymali: 134 566 548,00

Nie zapomnij kulturę.

13

Trzeba dostawcy niestandardowego formatu numer gdzie się zmienić charakter:

static void Main(string[] args) 
    { 
     decimal d = 2000000; 

     var f = new NumberFormatInfo {NumberGroupSeparator = " "}; 

     var s = d.ToString("n", f); // 2 000 000.00 
    } 

Tu również określić sformatować go jako liczbę (używając "n"), proszę zobaczyć ten link do innego formatowania Opcje:

Standard Numeric Format Strings

W tym przypadku nie będzie działać, jeśli sformatować jako walucie lub procentowo, ponieważ s może już zauważyć, że NumberFormatInfo ma osobne właściwości.

Aktualne informacje o formacie kultury można znaleźć pod adresem System.Globalization.CultureInfo.CurrentCulture.NumberFormat.

0

norweski locale używa spacji jako separatora, więc jeśli zostały zaprojektowanie strony internetowej lub aplikacji specjalnie dla Norwegów, a następnie można użyć:

(123897.11).ToString("n",new CultureInfo("nb-NO")) 

co skutkuje

"123 897,11" 

Oczywiście, jeśli nie piszesz aplikacji na rynek norweski, to byłoby głupie rozwiązanie.

Powiązane problemy