Ответ 1
Я думаю:
string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", 4.3);
должен делать то, что вы хотите.
У меня есть следующий номер: 4.3
Я хотел бы показать этот номер как 4,3
для некоторых наших европейских друзей.
У меня создалось впечатление, что следующая строка сделает трюк:
string ret = string.Format("{0:0,0}", 4.3); // returns "04", not "4,3"
Использую ли я неправильную строку?
Я думаю:
string.Format(System.Globalization.CultureInfo.GetCultureInfo("de-DE"), "{0:0.0}", 4.3);
должен делать то, что вы хотите.
NumberFormatInfo nfi = new NumberFormatInfo();
nfi.NumberDecimalSeparator = ",";
nfi.NumberGroupSeparator = ".";
double num = 4.3;
string ret = num.ToString(nfi); // 4,3
Это зависит от того, что вы хотите сделать. Если вы хотите, чтобы все ваше приложение было готово для выхода на другой язык, просто используйте
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo ("de-DE");
Если вы хотите иметь смешанное языковое приложение (это означает, что некоторые из выходов отформатированы на одном языке в другом), вы должны использовать перегрузки определенных строковых функций, таких как:
var culture = System.Globalization.CultureInfo.GetCultureInfo("de-DE");
String.Format (culture, "{0:0.0}", 4.3);
Первый метод предпочтительнее, если это возможно, потому что вам нужна только одна строка в вашем приложении, и все будет как ожидается. Во втором случае вы должны добавить параметр культуры к каждому методу string ouput во всем своем приложении.
Форматирование номера по умолчанию использует NumberFormatInfo из текущего CultureInfo, чтобы он отображался с использованием региональных настроек на компьютере.
Поэтому вам не нужно ничего особенного делать, кроме, может быть, убедитесь, что используется правильная CultureInfo.
Что касается вопроса, да, строка недействительна. A "," обозначает тысячу разделителей, а не десятичный разделитель. Посмотрите на NumberFormatInfo и пользовательские форматы чисел.
Для более общего решения вы можете установить культуру пользовательского интерфейса потока в культуру, используемую вашими европейскими друзьями. Это повлияет на представление чисел, валюты, дат и т.д.
Используйте CultureInfo, у которого есть запятые вместо десятичной точки (например, французский):
string.Format(CultureInfo.GetCultureInfo("fr-FR"), "{0:0.0}", 4.3);
Да, вы используете неправильную строку, и проблема не может быть решена путем предоставления строки форматирования.
Ваша строка форматирования - это форматирование номера с помощью шаблона "0"
, а затем выравнивание по длине 0
.
Когда вы укажете десятичный разделитель в строке форматирования, это всегда период, независимо от текущей культуры. Десятичный разделитель в результате форматирования, с другой стороны, всегда тот, который используется текущей культурой. Таким образом, чтобы получить запятую в качестве десятичного разделителя в результате, вы должны убедиться, что культура, используемая для форматирования, - это та, которая использует запятую в качестве десятичного разделителя.
Вы можете либо установить текущую культуру для потока, чтобы он по умолчанию использовался форматированием, либо указать культуру в вызове:
string ret = String.Format(CultureInfo.GetCultureInfo(1053), "{0:0.0}", 4.3);
Настройки культуры потока автоматически сделают это преобразование. Однако, если вы хотите отформатировать его с помощью настраиваемой строки, вы можете сделать следующее:
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;
Форматирование чисел может быть обработано для вас фреймворком, если вы используете правильный culture при манипулировании номером.
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
, откуда вы знаете, вошли ли они в t22 (запятая - десятичный разделитель) или 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), 1.234
(запятая - десятичный разделитель на французском языке) и 1,234
(опять же, запятая является десятичный разделитель на французском языке, а также культура потоков установлена на французский язык, поэтому она отображает с использованием этой культуры - отсюда и запятая как разделитель десятичной дроби на выходе).