Как бы я разделил тысячи с пространством в C#

предположим, что у меня есть следующий десятичный номер, который я должен отформатировать так, чтобы каждая тысяча была разделена пробелом:

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

Я пробовал Decimal.ToString ("0 000.00"). Хотя это работает довольно хорошо, когда число 1897.11. Но когда это 897.11, я получаю 0 897.11.

5 ответов


пройти в обычай NumberFormatInfo с пользовательским NumberGroupSeparator свойства, и использовать #,# формат заставить его работать группам. В этом примере в качестве основы используется числовой формат инвариантной культуры.

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

вам нужен поставщик пользовательского формата номера, где вы сами меняете символ:

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

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

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

здесь я также указываю форматировать его как число (используя "n"), см. Эту ссылку для других параметров форматирования:

Стандартные Строки Числового Формата

в этом случае он не будет работать, если вы форматируете как валюту или процент, потому что, как вы уже можете отметить NumberFormatInfo имеет отдельные свойства для тех, кто.

текущий информация о формате культуры можно найти на System.Globalization.CultureInfo.CurrentCulture.NumberFormat.


С строка пользовательского формата, но использовать " # " не " 0 - это обязательный токен, он будет там независимо от того, как долго число, знак фунта (#) является необязательным токеном, он будет использоваться только для цифр на самом деле в номере.

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

Примечание. Я оставлю это здесь, но ответ @Tim S лучше.

когда я пробую это, я вижу, что он генерирует только первый разделитель... Я думаю, что разделитель работает только для запятых и периодов здесь. Как обходной путь (до максимального размера, который вы ожидаете), попробуйте вместо этого.

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

попробуй такое

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

вы получили : 134 566 548,00

Не забывайте свою культуру.


Norwegian locale использует пробелы в качестве разделителя, поэтому, если вы разрабатывали веб-сайт или приложение специально для норвежцев, вы можете использовать:

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

что приводит к

"123 897,11"

очевидно, что если вы не пишете приложение для норвежского рынка, то это было бы глупое решение.