You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

ASP.NET Web API:如何让返回的decimal保留两位小数(含前导零)

问题描述

在ASP.NET Web API控制器中编写了如下动作方法:

public IActionResult GetProgres()
{
    var exampleProgress = new Progress()
    {
        Total = 100,
        Completed = 5,
        Progress = 5m
    };

    return Ok(exampleProgress);
}

对应的Progress类定义:

public class Progress
{
    public int Total { get; set; }
    public int Completed { get; set; }
    public decimal Progress { get; set; }
}

当前返回的JSON输出为:

{
    "total": 0,
    "sent": 0,
    "progress": 5
}

需将其中的"progress":5强制格式化为带两位小数的形式,即"progress":5.00。


解决方案

根据你使用的JSON序列化框架(默认是System.Text.Json,也可能是Newtonsoft.Json),提供以下几种实现方式:

一、使用System.Text.Json(ASP.NET Core默认)

1. 属性级自定义转换器(精准控制单个属性)

如果只需要给Progress属性设置格式,可自定义一个小数转换器,并应用到目标属性上:

using System.Text.Json;
using System.Text.Json.Serialization;

// 自定义两位小数转换器
public class TwoDecimalPlacesConverter : JsonConverter<decimal>
{
    // 反序列化逻辑
    public override decimal Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options)
    {
        return reader.GetDecimal();
    }

    // 序列化逻辑:四舍五入到两位小数后输出
    public override void Write(Utf8JsonWriter writer, decimal value, JsonSerializerOptions options)
    {
        // 若需要输出字符串形式的"5.00",替换为:
        // writer.WriteStringValue(value.ToString("F2"));
        writer.WriteNumberValue(Math.Round(value, 2));
    }
}

// 修改Progress类,给目标属性添加转换器特性
public class Progress
{
    public int Total { get; set; }
    public int Completed { get; set; }
    
    [JsonConverter(typeof(TwoDecimalPlacesConverter))]
    public decimal Progress { get; set; }
}

2. 全局配置(所有decimal类型统一格式)

如果希望项目中所有decimal类型都保留两位小数,可在Program.cs中全局配置序列化选项:

var builder = WebApplication.CreateBuilder(args);

// 添加控制器并配置JSON序列化
builder.Services.AddControllers()
    .AddJsonOptions(options =>
    {
        options.JsonSerializerOptions.Converters.Add(new TwoDecimalPlacesConverter());
    });

var app = builder.Build();
// ... 其他中间件配置
app.Run();

二、使用Newtonsoft.Json(Json.NET)

如果项目使用了Newtonsoft.Json作为序列化框架,可按以下方式处理:

1. 属性级自定义转换器

using Newtonsoft.Json;

// 自定义两位小数转换器
public class DecimalFormatConverter : JsonConverter<decimal>
{
    public override decimal ReadJson(JsonReader reader, Type objectType, decimal existingValue, bool hasExistingValue, JsonSerializer serializer)
    {
        return decimal.Parse(reader.Value.ToString());
    }

    public override void WriteJson(JsonWriter writer, decimal value, JsonSerializer serializer)
    {
        // 输出数字类型的5.00(JSON解析时仍为5,但显示带两位小数)
        writer.WriteValue(Math.Round(value, 2));
        // 若需要输出字符串形式,替换为:
        // writer.WriteValue(value.ToString("F2"));
    }
}

// 修改Progress类
public class Progress
{
    public int Total { get; set; }
    public int Completed { get; set; }
    
    [JsonConverter(typeof(DecimalFormatConverter))]
    public decimal Progress { get; set; }
}

2. 全局配置

在Program.cs中全局应用转换器:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddControllers()
    .AddNewtonsoftJson(options =>
    {
        options.SerializerSettings.Converters.Add(new DecimalFormatConverter());
    });

var app = builder.Build();
// ... 其他中间件配置
app.Run();

内容的提问来源于stack exchange,提问作者dafie

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 05:10:33