2015-02-09 3 views
3

У меня есть приложение MVC Web-API для внутреннего использования. У меня есть несколько страниц с формами и числовыми полями. Мне нужно установить это на немецком компьютере, и пользователи будут только немцами. В Германии они пишут «3,5» вместо «3,5» (с запятой).Немецкая культура - получите двойной номер от JSON с запятой

В конфигурации IIS культура является «инвариантной культурой», а поскольку компьютер является немецким - локализация - «de-DE».

Когда пользователи пишут «3,5» в поле - я вижу в firebug, что «3,5» - это то, что отправлено в JSON, но сервер получает его как «35».

Могу ли я обработать его на стороне сервера? (Я не хочу, чтобы изменить JSON, потому что мне нужно сделать это в каждой области и страницы)

using Newtonsoft.Json; 
using Newtonsoft.Json.Converters; 
public class ItemsController : ApiController, IDisposable 
{ 
     [Authorize(Roles = "Admin")] 
     [HttpPost] 
     public HttpResponseMessage UpdateItem(ItemViewModel itemVM) 
     { 
      // JSON data sent data.NumProp1 = "3,5" 
      // itemVM.NumProp1 contains "35" instead of "3.5" 
     } 
} 
+0

Номера JSON не должны быть локализованы. Вы должны либо интерпретировать пользовательский вход на стороне клиента, либо отправить фактический номер (который использует '.'), либо включить пользовательский ввод в виде строки и интерпретировать его на стороне сервера. – Timo

ответ

2

Вы не должны локализовать JSON - см http://www.json.org для спецификации (которая показывает только точку как разделитель) и How to localize when JSON-serializing? для аналогичного вопроса.

Я бы не рекомендовал пробовать настроить JSON - это может показаться быстрой победой прямо сейчас, но в конце концов вы просто не используете JSON.

+0

Обратите внимание, что я написал, что я не хочу изменять данные из JSON. Если пользователь отправляет «3,5» - это то, что отправляется на сервер. Я просто хочу, чтобы сервер получил правильное значение. Я не думаю, что понял ваш ответ. Мне нужно изменить «3,5» на «3,5», прежде чем отправлять его как JSON? – TamarG

+0

@TamarG: Да, это общее сообщение. Не отправляйте то, что не является JSON. Если вы говорите *, это так, должно быть. –

+0

Очень много полей и страниц для исправления :-( – TamarG

0

Вы необходимо использовать CultureInfo.InvariantCulture на всех струнных форматированием вызовов при работе с persitence (и JSON обмены являются технически формой persitence):

сохраняющиеся данных

Свойство InvariantCulture может быть используется для сохранения данных в формате, не зависящем от культуры . Это обеспечивает известный формат, который не изменяет и может использоваться для сериализации и десериализации данных по культурам . После десериализации данных он может быть отформатирован на основе культурных соглашений текущего пользователя. Например, если вы выбрали для сохранения данных даты и времени в строке формы, вы можете передать объект InvariantCulture методы DateTime.ToString(String, IFormatProvider) или DateTimeOffset.ToString(IFormatProvider) создать строку, и вы можете передать объект InvariantCulture к DateTime.Parse(String, IFormatProvider) или DateTimeOffset.Parse(String, IFormatProvider, DateTimeStyles) метод , чтобы преобразовать строку в значение даты и времени. Этот метод гарантирует, что базовые значения даты и времени не изменяются, когда данные считываются или записываются пользователями из разных культур.

Это относится к всех типов: числовые, десятичных, поплавки и двойники, дата и время и т.д. Используйте инвариантную культуру как при записи и при чтении сериализованных данных. Используйте инвариантную культуру по обе стороны обмена JSON.

Кстати, если вы будете использовать встроенные сериализаторы JSON, вы уже получите этот обед бесплатно: JsonWriter.cs, JsonReader.cs.

0

Как уже говорилось: JSON является стандартом, и вы должны никогда отклоняться от стандарта. Это сделает вашу жизнь несчастной.

Если пользователи вводят некоторые номера в виде веб-формы, эта веб-форма должна сериализоваться в правильном формате JSON. Я думаю, что обычно это делается уже, если вы используете правильные числовые типы в своей форме, например input type='number' и т. Д. На конце сервера вы должны прочитать его, используя InvariantCulture.

Эта потребность в общем решении подтверждается W3C, как вы можете видеть в черновике W3C HTML JSON form submission.

0

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

str = str.Replace(",", System.Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 

Вы можете конвертировать вашу строку в числовое значение, используя такие вещи, как Convert.ToInt32