【问题标题】:Truncate Decimal value till 2 points using Data Annotations使用数据注释将十进制值截断至 2 点
【发布时间】:2021-04-27 06:12:08
【问题描述】:

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

当我在任何 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 级别更正此问题(需要最少的代码更改,因此首选数据注释组合)

【问题讨论】:

  • 您能否再充实一下您的示例,好吗?我希望这与需要格式化显示值有关,而不是验证输入。
  • @Llama 你说得对,格式而不是验证,api 使用者应该得到 #.00 格式,我用更详细的例子更新了我的问题
  • 如果 JSON 响应包含 67.50,那么您无能为力,因为您已经完成了所有可以做的事情。客户端将 67.50 解释为 67.5000 并没有错,因为它们都是相同值的表示,但如果需要不同的值,则必须修改客户端。

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


【解决方案1】:

我最近遇到了这个问题。

您可以创建一个新类并覆盖序列化程序的默认 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

【讨论】:

    猜你喜欢
    • 2012-03-22
    • 2021-10-12
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-30
    • 2010-09-23
    相关资源
    最近更新 更多