#javascript #c# #asp.net-mvc-4 #globalization
#javascript #c# #asp.net-mvc-4 #глобализация
Вопрос:
Звучит просто — и я знаю, что это так… но у меня возникли проблемы с этим, и я точно не знаю, почему..
У меня есть веб-приложение, глобализированное (многоязычное). Когда я нажимаю, чтобы изменить язык, это мое действие:
public ActionResult ChangeCulture(string lang)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo(lang);
Thread.CurrentThread.CurrentUICulture = Thread.CurrentThread.CurrentCulture;
var languageCookie = new HttpCookie("_language") { Value = lang, Expires = DateTime.UtcNow.AddYears(1) };
Response.Cookies.Remove("_language");
Response.SetCookie(languageCookie);
return Redirect(Request.UrlReferrer.PathAndQuery);
}
И у меня есть страница для отображения некоторого символа (я использую chart.js ) и мне нужно привязать a List<double>
к массиву javascript.
Итак, этот список выглядит так:
var list = new List<double> {144, 0, 540.23};
И мне нужен простой массив в javascript:
var arr = [144, 0, 540.23];
Вот как я делаю (razor):
var arr = [@string.Join(",", Model.ListWithDoubles.Select(x => Convert.ToString(x, new CultureInfo("en-US"))))]
Проблема в том:
Когда я использую английский язык, он работает довольно хорошо. Вместо этого другие языки дают мне целые числа…
var arr = [144, 0, 540.23]; //en-US
var arr = [144, 0, 54023]; //pt-BR
var arr = [144, 0, 54023]; //it
var arr = [144, 0, 54023]; //es
Вопросы
- Почему?
- Как исправить?
Ответ №1:
Потому что в некоторых других en-US
,
некультурах и .
имеют прямо противоположное значение и употребление. Если вы не отображаете эти данные только для целей диаграммы, используйте CultureInfo.InvariantCulture при преобразовании двойного в строковое представление для HTML. Вы должны преобразовать в строку, специфичную для конкретного языка, только в том месте, где вы хотите фактически визуально отобразить это значение данных для пользователя.
var arr = [@string.Join(",", Model.ListWithDoubles.Select(x => Convert.ToString(x, CultureInfo.InvariantCulture)))]
Спецификатор формата по умолчанию для double
G
таков, что он создаст вывод только с десятичным разделителем. Поскольку вам нужно исходное число (не отформатированное для отображения), то это (CultureInfo.InvariantCulture) — это то, что вам нужно передать, а не строковое представление в формате культуры, поскольку оно предназначено только для отображения.
Чтобы проиллюстрировать, что опубликованный мной код работает независимо от культуры текущего потока, вот этот код. Поместите это в консольное приложение, замените Main
метод и запустите его. Вы увидите, что это работает. Ваша проблема заключается в другом, а не в этом коде.
static void Main(string[] args)
{
var cultures = new[] {"en-US", "pt-BR", "it", "es"};
var list = new List<double> {144, 0, 540.23};
Console.WriteLine("Without specifying a culture");
foreach (var culture in cultures.Select(isoCulture => new CultureInfo(isoCulture)))
{
System.Threading.Thread.CurrentThread.CurrentCulture = culture;
System.Threading.Thread.CurrentThread.CurrentUICulture = culture;
Console.WriteLine("Culture: " culture.Name);
Console.WriteLine("Not defined: " string.Join(",", list.Select(x => Convert.ToString(x))));
Console.WriteLine("CultureInfo.InvariantCulture: " string.Join(",", list.Select(x => Convert.ToString(x, CultureInfo.InvariantCulture))));
}
Console.ReadLine(); // stops so you can see the results
}
Комментарии:
1. Я уже пробовал это, и это не работает…. Я думаю, это потому
Thread.CurrentThread.CurrentUICulture
, что я меняю, когда меняю язык сайта..2. @MarllonNasser — это действительно работает (убедитесь, что вы скомпилировали и опубликовали свой код с последними изменениями). Даже пример в документации Microsoft показывает этот точно такой же метод, поэтому, если бы он не работал, было бы много других жалоб на эту функциональность до вашего вопроса. Смотрите пример на странице Convert. toString
3. @MarllonNasser — это предполагает, что
Model.ListWithDoubles
на самом деле это типList<double>
или, по крайней мере, что-то, что реализуетIEnumerable<double>
4. но это тип
List<double>
, как я уже сказал:var list = new List<double> {144, 0, 540.23};
Это мойListWithDoubles
. извините5. Я просто больше не мог принимать такого рода ошибки … взяв добычу, в которой был привязан мой список double, я заметил, что я преобразовал в Double без CultureInfo ..
DoubleValue = Convert.ToDouble(Convert.ToString(dr["data_row_double"]).Replace(",", "."))
поэтому я добавил, и это, наконец, работает … спасибо, приятель!