Форматирование чисел как строк с запятыми вместо десятичных дробей - PullRequest
13 голосов
/ 13 октября 2009

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

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

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

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

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

Ответы [ 9 ]

31 голосов
/ 13 октября 2009
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
nfi.NumberGroupSeparator = ".";

double num = 4.3;
string ret = num.ToString(nfi);    // 4,3
31 голосов
/ 13 октября 2009

Я думаю:

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

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

11 голосов
/ 13 октября 2009

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

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 во всем приложении.

3 голосов
/ 13 октября 2009

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

2 голосов
/ 13 октября 2009

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

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

Что касается вопроса, да, строка неверна. «,» Обозначает разделитель тысяч, а не десятичный разделитель. Взгляните на NumberFormatInfo и форматы пользовательских чисел .

1 голос
/ 13 октября 2009

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

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

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

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

string ret = String.Format(CultureInfo.GetCultureInfo(1053), "{0:0.0}", 4.3);
1 голос
/ 13 октября 2009

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

string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3);
0 голосов
/ 13 октября 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 (опять же, запятая десятичный разделитель на французском языке, а также культура потока установлена ​​на французский, поэтому она отображается с использованием этой культуры - отсюда запятая в качестве десятичного разделителя в выходных данных).

0 голосов
/ 13 октября 2009

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

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

или

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

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

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

string decimalChar = Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator;
...