@dmitrytut

Как в ASP.NET Web Api передавать Decimal тип с различными разделителями ('.'\',')?

Добрый день!

Ситуация такая.
Decimal приходит с клиента, разделителем может быть точка или запятая (ex. 3.14, 6,62). Из-за настроек Culture на сервере вариант с точкой принимается, а в случае с запятой - эта запятая проcто убирается. Было: 6,62, пришло в контроллер: 662.
Как бы сделать так, чтобы у всех decimal типов при приходе на сервер заменялась бы запятая на точку, или подскажите, пожалуйста, наиболее правильный вариант действий в моем случае?

P.S.
Можно написать JSON.Net custom converter, но его, как я понял, придется вручную применять к нужным мне параметрам, а хотелось бы, чтобы ко всем пришедшим параметрам типа decimal.
Спасибо.
  • Вопрос задан
  • 3414 просмотров
Решения вопроса 1
@dmitrytut Автор вопроса
В общем, кому интересно, в итоге написал JSON.Net конвертер, который заменяет запятую на точку и зарегистрировал его глобально (оказывается так можно) чтобы обрабатывались все decimal.
Конвертер:
public class DecimalFormatConverter: JsonConverter
  {
    public override bool CanConvert(Type objectType)
    {
        return (objectType == typeof(decimal) || objectType == typeof(decimal?));
    }

    public override void WriteJson(
      JsonWriter writer, 
      object value, 
      JsonSerializer serializer)
    {
        writer.WriteValue(value);
    }

    public override object ReadJson(
      JsonReader reader, 
      Type objectType, 
      object existingValue, 
      JsonSerializer serializer)
    {
      if (reader.Value != null)
      {
        try
        {
          string replacedValue = reader.Value.ToString().Replace(',', '.');

          return decimal.Parse(replacedValue, CultureInfo.InvariantCulture);
        }
        catch (Exception ex)
        { 
          throw new Exception(
            String.Format("Decimal coverting error. Message: {0}.", ex.Message));
        }
      }
      return null;
    }
  }


И его глобальная регистрация в файле Global.asax.cs в методе Application_Start():
...
GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings.Converters.Add(new DecimalFormatConverter());
...


Но все же, интересно послушать критику такого подхода и способы решения из разряда Best Practices, наверняка сталкивались?
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
foxmuldercp
@foxmuldercp
Системный администратор, программист, фотограф
А не проще ли работать с локалью клиента и преобразовывать в нужный формат?
я вот сейчас буду разбираться с аналогичной проблемой, но у меня mvc без json
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы