Форматирование чисел в виде строк с запятыми вместо десятичных знаков

У меня есть следующий номер: 4.3

Я хотел бы отобразить это число как 4,3 для некоторых наших европейских друзей.

У меня сложилось впечатление, что следующая строка поможет:

string ret = string.Format("{0:0,0}", 4.3); // returns "04", not "4,3"

Я использую неправильную строку?


person DaveDev    schedule 13.10.2009    source источник


Ответы (9)


Я думаю:

string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", 4.3); 

должен делать то, что вы хотите.

person JDunkerley    schedule 13.10.2009
comment
позаботится и о тысячах, которые тоже делаются по-разному. - person dove; 13.10.2009
comment
Но у него есть тот недостаток, что вам нужно вручную вставлять информацию о культуре в КАЖДЫЙ ToString, String.Format, Number.Parse и аналогичный метод в вашем коде. - person Foxfire; 13.10.2009
comment
Это помогает в конкретном случае, но не позволяет указать десятичную точку. - person Léon Pelletier; 01.10.2014

Это зависит от того, что вы хотите сделать. Если вы хотите, чтобы все ваше приложение было готово для вывода на другом языке, просто используйте

System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("de-DE");

Если вы хотите иметь смешанное языковое приложение (это означает, что некоторые выходные данные отформатированы на одном языке, а некоторые на другом), вы должны использовать перегрузки определенных функций String, например:

var culture =  System.Globalization.CultureInfo.GetCultureInfo("de-DE");   
String.Format (culture, "{0:0.0}", 4.3);

Первый метод предпочтительнее, если это возможно, потому что вам нужна только одна строка в вашем приложении, и все будет так, как ожидалось. Во втором вы должны добавить параметр культуры к каждому методу вывода String во всем приложении.

person Foxfire    schedule 13.10.2009
comment
Это отличный ответ. Вы знаете, можно ли это установить через файл конфигурации? - person Greg; 05.05.2010
comment
@Greg раздел глобализации в ASP.NET, а не в WinForms, консольных приложениях, я думаю. - person Kiquenet; 22.02.2017

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

person bzlm    schedule 13.10.2009

Форматирование чисел по умолчанию использует NumberFormatInfo из текущий CultureInfo, чтобы он отображался с использованием региональных настройки на компьютере.

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

Что касается вопроса, да, строка недействительна. "," обозначает разделитель тысяч, а не десятичный разделитель. Посмотрите NumberFormatInfo и пользовательские числовые форматы.

person Lucero    schedule 13.10.2009

Используйте CultureInfo с запятыми вместо десятичной точки (например, французский):

string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3);
person Thomas Levesque    schedule 13.10.2009

Да, вы используете неправильную строку, а также проблему нельзя решить, указав только строку форматирования.

Что делает ваша строка форматирования, так это форматирование числа с использованием шаблона "0", а затем выравнивание по длине 0.

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

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

string ret = String.Format(CultureInfo.GetCultureInfo(1053), "{0:0.0}", 4.3);
person Guffa    schedule 13.10.2009

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

string ret = string.Format("{0:0.00}", 4.3);

or

string ret = (4.3f).ToString("0.00");

"." — это спецификатор формата для десятичной точки для текущего языка и региональных параметров. Дополнительную информацию о настраиваемых числовых форматах можно найти по адресу: http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

Вы всегда можете проверить, какой символ для десятичной точки:

string decimalChar = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
person Torbjörn Hansson    schedule 13.10.2009

Форматирование чисел может быть обработано платформой, если вы используете правильный культура при манипулировании числом.

Console.WriteLine(4.3);

Console.WriteLine(4.3.ToString(CultureInfo.GetCultureInfo("fr-fr")));

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr");
Console.WriteLine(4.3);

Если вы хотите сделать «одноразовый» дисплей, подойдет второй подход. Если вы хотите правильно отображать каждое число, вам действительно следует установить культура текущего потока. Таким образом, любые манипуляции с числами будут правильно обрабатывать десятичные разделители, группировать символы и любые другие вещи, зависящие от культуры.

То же самое касается разбора чисел. Если пользователь вводит 1,234, как узнать, ввел ли он 1.234 (запятая — десятичный разделитель) или 1234 (запятая — разделитель групп)? Именно здесь культура помогает, поскольку она знает, как отображать числа, а также может использоваться для их правильного анализа:

Console.WriteLine(double.Parse("1,234"));

Console.WriteLine(double.Parse("1,234", CultureInfo.GetCultureInfo("fr-fr")));

Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("fr-fr");
Console.WriteLine(double.Parse("1,234"));

Приведенное выше выведет 1234 (запятая является десятичным разделителем в моей культуре en-us по умолчанию), 1.234 (запятая является десятичным разделителем во французском языке) и 1,234 (опять же, запятая является десятичным разделителем во французском языке, а также для культуры задан французский язык, поэтому он отображается с использованием этой культуры - отсюда и запятая в качестве десятичного разделителя в выводе).

person adrianbanks    schedule 13.10.2009

person    schedule
comment
@James: за исключением того, что это довольно бесполезно, поскольку поддержка культуры встроена в .NET. Лучше сделать это поддерживаемым способом, а не изобретать его заново. - person Mats Fredriksson; 13.10.2009
comment
@Mats: А что произойдет, если вы решите выбрать произвольный европейский объект CultureInfo (например, de-DE или fr-FR), и эта культура была настроена для использования другого десятичного разделителя? Я знаю, что это маловероятный сценарий, но это может произойти. Используя мой код, вы всегда будете получать , в качестве десятичного разделителя, независимо от каких-либо настроек. - person LukeH; 13.10.2009
comment
Но вы не хотите всегда получать ,, вы хотите форматировать строки в соответствии с региональными настройками пользователя (включая его/ее индивидуальные настройки). - person Groo; 13.10.2009
comment
@Groo: вопрос не в этом. В нем специально указано отображать этот номер как 4,3 не отображать этот номер в соответствии с региональными настройками пользователя (включая его/ее индивидуальные настройки). - person LukeH; 13.10.2009
comment
@luke: он говорит отображать это число как 4,3 для некоторых наших европейских друзей, что я бы интерпретировал как отображаемые значения в соответствии с языковыми стандартами конечных пользователей, но я могу ошибаться. Если он хочет отобразить его в соответствии с культурой конечных пользователей, я бы использовал эту культуру. Не случайно выбранный, правда, а конечные пользователи. - person Mats Fredriksson; 13.10.2009