Как указать пользовательский разделитель тысяч в формате строки - PullRequest
10 голосов
/ 26 августа 2011

Когда я пробую приведенный ниже код, я получаю вывод 2 084 001 . Что здесь может быть не так? Разве моя строка формата не должна переопределять текущие настройки культуры?

decimal v = 2084000.7621m;
System.Console.WriteLine(v.ToString("#,###,###"));
System.Console.ReadLine();

Если я изменяю код для использования ToString("#,###,###", CultureInfo.InvariantCulture), я получаю ожидаемый вывод, то есть 2,084,001 , но я не могу указать поставщика формата, когда задаю свойство DataFormatString для своих данных связанные элементы управления.

ПРЕДУПРЕЖДЕНИЕ: При использовании экранированного литерального группового разделителя, как описано ниже в принятых и других ответах, используемый литеральный символ всегда выводится, даже если он не нужен, например, применение строки формата #\,###\,### к значению 324 приводит к выходному значению ,,324.

Ответы [ 2 ]

7 голосов
/ 26 августа 2011

Насколько я понимаю Пользовательские строки числового формата , символ , предназначен для помещения разделителя группы в форматирование (а не для указания, какой символ использовать). Чтобы сделать его явным символом, вам нужно использовать escape-символ \.

v.ToString(@"#\,###\,###")

Который имеет тот недостаток, что строка формата зависит от размера числа. В этом случае вы всегда получаете две запятые в результирующей строке, даже если число меньше или больше.

Чтобы переопределить разделитель групп, вам нужно указать свой собственный NumberFormatInfo.

Получил этот тест работает:

decimal v = 2084000.7621m;

// clone the InvariantCulture to avoid specifying everything from scratch
var myNumberFormat = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
myNumberFormat.NumberGroupSeparator = "@";
myNumberFormat.NumberDecimalSeparator = "*";
Assert.AreEqual("2@084@000*7621", v.ToString("#,###,###.####", myNumberFormat));

На самом деле не имеет значения, где и сколько разделителей групп вы поместите в строку формата. Вы также можете сделать это: "#,#.####" с точно таким же результатом. (В этом преимущество использования символа разделителя групп по сравнению с первым решением).

1 голос
/ 26 августа 2011

Ваша проблема в том, что символ , в строке формата не означает «вставить запятую»;на самом деле это означает «вставить разделитель тысяч для текущей локали», который является пробелом в локали по умолчанию.

Вам нужно будет экранировать запятую, поставив обратную косую черту \ перед ней в вашем форматестрока.Возможно, вам придется использовать двойную обратную косую черту (или дословную строку), чтобы компилятор принял escape, как вы и предполагали.

...