2016-10-11 6 views
0

Звуки Simples - И я знаю, что это ... но я имею проблемы с ним, и не знаю, почему именно ..Double ToString хранение формат «EN-US»

У меня есть веб-приложение глобализованную (Multilanguages). Когда я нажимаю, чтобы изменить язык, это мое действие:

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), и мне нужно, чтобы связать List<double> с яваскриптом массива.

Так что этот список выглядит следующим образом:

var list = new List<double> {144, 0, 540.23}; 

И мне нужен массив Simples в JavaScript:

var arr = [144, 0, 540.23]; 

Вот как я делаю (бритва):

var arr = [@string.Join(",", Model.ListWithDoubles.Select(x => Convert.ToString(x, new CultureInfo("en-US"))))] 

Проблема заключается в следующем:

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

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. Почему?
  2. Как исправить?

ответ

0

Потому что в некоторых других не 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 
} 
+0

Я попытался это уже и не работает .... Я думаю, что его, потому что я изменить 'Thread.CurrentThread.CurrentUICulture', когда я изменить язык сайта .. –

+0

@MarllonNasser - это работа, (убедитесь, что вы скомпилировали и опубликовали свой код с последними изменениями). Даже пример документации Microsoft показывает этот точно такой же метод, поэтому, если он не работает, было бы много других жалоб на эту функциональность до вашего вопроса. См. Пример на странице [Convert.ToString] (https://msdn.microsoft.com/en-us/library/ms131010 (v = vs.110) .aspx) – Igor

+0

@MarllonNasser - это предполагает, что 'Model.ListWithDoubles' фактически является типом' List ' или, по крайней мере, чем-то, что реализует 'IEnumerable ' – Igor

Смежные вопросы