c# - 使用数据注释将十进制值截断至 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 级别更正此问题(需要最少的代码更改,因此首选数据注释组合)
解决方案
我最近遇到了这个问题。
您可以创建一个新类并覆盖序列化程序的默认 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。
推荐阅读
- angular - Typescript嵌套接口抛出错误
- python - 如何填写未知大小的熊猫数据框
- visual-studio - MFC 对话框类向导 - 尝试在单独的包含和 src 目录中生成类
- c# - 将文本块绑定到 XAML 中的字典在按键绑定时不显示值
- swift - CAEmitter 将粒子垂直放置在随机位置
- php - 允许在不使用 wpdatatable 重新加载页面的情况下选择表中的行的动态过滤
- azure - Azure B2C UI 自定义
- reactjs - React 错误处理 - 为什么应用程序崩溃?
- python - 神经网络的单一预测(张量流,急切执行)
- javascript - 所有 SVG 的唯一 React 组件