У меня есть webapi, возвращающий сумму (упрощенный пример):

Поэтому он может вернуться, например:

{
    Amount:40
}

{
    Amount:40.1
}

{
    Amount:40.15
}

Можно ли всегда возвращать число с двумя десятичными знаками:

{
    Amount:40.00
}

{
    Amount:40.10
}

{
    Amount:40.15
}
-1
Bruno 27 Июн 2017 в 17:44
Если вы используете Json.Net, это может быть решением.
 – 
stuartd
27 Июн 2017 в 17:45
40.00 - это формат числа. номер такой же 40
 – 
Sergey Berezovskiy
27 Июн 2017 в 17:45
Я согласен, что это то же самое, просто интересно, возможно ли это (и я не хочу возвращать строку)
 – 
ibiza
27 Июн 2017 в 17:46
Зачем вам делать это вместо обработки форматирования с помощью кода пользовательского интерфейса?
 – 
SQLMason
27 Июн 2017 в 17:47
1
Число. Легко проверить на себе, но вот вам: i.stack.imgur.com/BLz1c.png
 – 
stuartd
27 Июн 2017 в 17:59

2 ответа

Вы можете использовать настраиваемый конвертер, который округляет каждое десятичное значение до заданного количества знаков после запятой:

public class JsonDecimalConverter : JsonConverter
{
    private int decimals;

    public JsonDecimalConverter(int decimals = 2)
    {
        this.decimals = decimals;
    }

    public override bool CanConvert(Type objectType) => objectType == typeof(decimal);

    public override object ReadJson(JsonReader reader,
       Type objectType, object existingValue, JsonSerializer serializer)
    {
        throw new NotImplementedException();
    }

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

Применение:

var thing = new Thing { Amount = 40.12345M, Name = "Foo" };
var json = JsonConvert.SerializeObject(thing, new JsonDecimalConverter());

Выход:

{
  "Amount": 40.12,
  "Name": "Foo"
}

Обратите внимание, что это даст вам 40 для десятичного числа 40. Потому что нет значимых цифр, которые нужно хранить. 40.00 - это проблема форматирования строки, которую вы должны решить, где вы хотите отобразить или сохранить это десятичное представление.

2
Sergey Berezovskiy 27 Июн 2017 в 18:10
Очевидно, @stuartd предоставил пример, который будет работать даже с 40: i.stack.imgur.com/BLz1c .png
 – 
ibiza
27 Июн 2017 в 18:14
Что ж, для меня немного удивительно, что Json NET выводит значение в виде числа. Но все, что вы здесь получаете, - это json большего размера. После того, как вы воспользуетесь этим json и десериализуете его, нули 40.00 исчезнут. Чтобы вывести эти нули, вам все равно нужно отформатировать число
 – 
Sergey Berezovskiy
27 Июн 2017 в 18:28

Вам просто нужно использовать

decimal.Round(myDecimalValue, 2)
0
RobPethi 27 Июн 2017 в 17:55
1
Но если я хочу и дальше возвращать число (а не строку), возможно ли это?
 – 
ibiza
27 Июн 2017 в 17:50
Ваше значение - десятичное или двойное?
 – 
RobPethi
27 Июн 2017 в 17:53
Сумма - десятичная
 – 
ibiza
27 Июн 2017 в 17:54
Это будет работать, только если на самом деле есть 2 или более десятичных значения. 2 вернет 2, а 2.1 вернет 2.1.
 – 
krlzlx
27 Июн 2017 в 18:05