返回 JSON 数据时是不是可以自定义小数精度?

Posted

技术标签:

【中文标题】返回 JSON 数据时是不是可以自定义小数精度?【英文标题】:Is it possible to have a custom decimal precision when returning JSON data?返回 JSON 数据时是否可以自定义小数精度? 【发布时间】:2017-06-27 14:44:06 【问题描述】:

我有一个 webapi 返回一个金额(简化示例):

所以它可以返回例如:


    Amount:40



    Amount:40.1



    Amount:40.15

是否可以始终返回带有 2 位小数的数字:


    Amount:40.00



    Amount:40.10



    Amount:40.15

【问题讨论】:

如果您使用 Json.Net,this 可能是解决方案。 40.00 是数字的格式。号码相同40 @SergeyBerezovskiy 我同意它是一样的,只是想知道它是否可能(我不想返回一个字符串) 为什么要这样做而不是使用 UI 代码处理格式化? 号码。自己测试很容易,但你可以去:i.stack.imgur.com/BLz1c.png 【参考方案1】:

您可以使用自定义转换器将每个十进制值四舍五入为给定的小数位数:

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 是一个字符串格式问题,您应该在要显示或存储此十进制表示的位置处理它。

【讨论】:

显然@stuartd 提供了一个即使是 40 也可以工作的示例:i.stack.imgur.com/BLz1c.png @ibiza 好吧,Json NET 将值输出为数字对我来说有点令人惊讶。但是你在这里获得的只是更大的 json。在您使用此 json 并对其进行反序列化后,40.00 的零值将消失。要输出这些零,您无论如何都需要格式化数字【参考方案2】:

你只需要使用

decimal.Round(myDecimalValue, 2)

【讨论】:

但是如果我想继续返回一个数字(不是字符串),有可能吗? 你的值是小数还是双精度? 金额为小数 这只有在实际有 2 个或更多十进制值时才有效。 2 将返回 2,2.1 将返回 2.1。

以上是关于返回 JSON 数据时是不是可以自定义小数精度?的主要内容,如果未能解决你的问题,请参考以下文章

使用自定义组和小数分隔符将数字格式化为字符串而不更改精度

SpringMVC3.2 解决PO返回前台转成JSON时数据Long精度丢失问题

Django 使用自定义 SQL 而不是模型将 JSON 对象返回到模板

如何使用json.net自定义反序列化为对象

使用自定义 json 函数检索数据时分页不起作用

怎样自定义MyBatis的返回值为JSON格式?