Используйте пользовательский разделитель тысяч в С#

Я пытаюсь не использовать символ ',' в качестве разделителя тысяч при отображении строки, а вместо этого использовать пробел. Я предполагаю, что мне нужно определить пользовательскую культуру, но я, кажется, не понимаю это правильно. Любые указатели?

например: отображать 1000000 как 1 000 000 вместо 1 000 000

(нет, String.Replace() это не то решение, которое я хотел бы использовать: P)


person Luk    schedule 15.04.2009    source источник
comment
Что не так с использованием String.Replace()?   -  person Jon B    schedule 15.04.2009
comment
@Jon B - потому что Replace не будет независимой от культуры. Что делать, если вы работаете на компьютере, где тысяча сепараторов. ?   -  person Peter Lillevold    schedule 15.04.2009
comment
и поскольку я уже форматирую число, это загромождает код   -  person Luk    schedule 15.04.2009
comment
@Peter - я думаю, вы могли бы использовать InvariantCulture, а затем выполнить String.Replace(). Я не считаю это хорошим решением, мне просто любопытно, почему ОП был против этого.   -  person Jon B    schedule 15.04.2009
comment
Потому что это взлом?   -  person Anders Lindén    schedule 13.03.2015


Ответы (4)


Я предлагаю вам найти NumberFormatInfo, который наиболее точно соответствует тому, что вы хотите (т. е. сразу после разделителя тысяч), вызовите Clone() на нем, а затем установите NumberGroupSeparator свойство. (Если вы собираетесь форматировать числа с использованием денежных форматов, вам нужно изменить CurrencyGroupSeparator вместо/а также.) Используйте это в качестве информации о формате для ваших вызовов на string.Format и т. д., и все будет в порядке. Например:

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
    }
}
person Jon Skeet    schedule 15.04.2009
comment
У LoadBalancer бренда Skeet есть проблемы с маршрутизацией? - person Dead account; 15.04.2009
comment
Это здорово меня выручает. Превосходно! - person Oppdal; 24.11.2011

Создайте собственную NumberFormatInfo ( производная) с другим разделителем тысяч.

person Lucero    schedule 15.04.2009

Есть немного более простая версия Jon Skeet one:

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
    }
}

А инициализацию 'nfi' можно было бы пропустить и поместить непосредственно в качестве параметра в метод ToString().

person Invvard    schedule 24.01.2014
comment
Это в основном переписанный ответ Джона Скита. Не совсем креативно или короче! - person Lorenz Lo Sauer; 07.07.2016

Самый простой способ...

num.ToString("### ### ### ### ##0.00")
person Gordon Bell    schedule 15.04.2009
comment
Хотя это работает, на самом деле перед числом будут появляться пробелы. Например, перед числом 1 будет 4 пробела. Так что, как минимум, вам придется его обрезать. Я думаю, что лучшим решением является настройка NumberFormatInfo, если вы хотите переопределить формат по умолчанию для культуры. - person Johncl; 04.10.2011