首页 > 解决方案 > 使用数据注释将十进制值截断至 2 点

问题描述

我的模型中有一个小数属性来显示一些数字

当我在任何 JSON 编辑器工具中大摇大摆地检查我的 API 时,它显示 #.00 格式(小数点后两位数),但是当我将它输入浏览器时,它显示 #.0000 格式(小数点后四位)。

有人可以解释这是什么行为以及解决方案是什么

因为我为此尝试了正则表达式,但似乎仅用于验证,不采取任何措施将其值截断至 2 位

[RegularExpression(@"^\d+\.\d{0,2}$")]

示例:使用数据注释(首选方式)而不是使用 ToString("F2") 或 ToString("#.00") 的预期值是 67.50 而不是 67.500

编辑1:

一个更详细的例子:

当我们在浏览器中点击 api 时,属性值为 67.5000 ,

通过 swagger 或 postman 工具检查时属性值为 67.50

在许多应用程序(MVC、Angular 6、android)中使用 api 并在网页上显示时获得 67.5000。

可以使用字符串格式化程序解决,但我无法访问前端,唯一的解决方案是在 api 级别更正此问题(需要最少的代码更改,因此首选数据注释组合)

标签: c#.net-coreasp.net-core-webapi

解决方案


我最近遇到了这个问题。

您可以创建一个新类并覆盖序列化程序的默认 json 行为。

请注意该解决方案适用于 .net core 2.1。它也适用于对启动类代码进行更改的 .NET 5。

创建一个文件并将其命名为 DecimalPrecisionUtil.cs 之类的名称,并向其中添加以下代码。

using System;
using Newtonsoft.Json;

namespace YourNamespace {
  public class DecimalPrecsionUtil: JsonConverter < decimal > {

    public override decimal ReadJson(JsonReader reader, Type objectType, decimal existingValue, bool hasExistingValue, JsonSerializer serializer) {
      return Convert.ToDecimal(reader.Value);
    }

    public override void WriteJson(JsonWriter writer, decimal value, JsonSerializer serializer) {
      writer.WriteValue(string.Format("{0:F2}", value));
    }
  }
}

在 startup.cs 文件中添加以下代码(该代码适用于 .net core 2.1,您可能需要针对 .NET 5 稍作更改

public void ConfigureServices(IServiceCollection services)
        {

            //adding overriden json serializer options
            services.AddMvc().AddJsonOptions(options =>
            {
                options.SerializerSettings.Converters.Add(new DecimalPrecsionUtil());
            });
        }

如果您只需要在从 api 返回数据时显示两位小数精度,但在将数据发送到 api 时需要保持完整精度,您可以修改DecimalPrecisionUtil中的ReadJson方法,而不是返回十进制值,只需抛出NotImplementedException


推荐阅读