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

SQL Server返回十进制整数部分 解决ASP.NET返回值带.0问题

问题根因

[DisplayFormat] 特性仅在ASP.NET MVC的Razor视图渲染、表单回显场景生效,Web API执行JSON序列化构造HTTP响应时,不会读取该特性的配置规则,因此你设置的格式化逻辑完全没有被执行。decimal类型默认序列化逻辑会保留小数位,即使小数位为0也会输出.0后缀。


解决方案

方案1:直接修改实体属性类型(成本最低,无额外兼容问题)

你已经明确该字段所有存储值均为整数,且数据库类型为decimal(6,0)(精度6位、小数位0,数值范围完全在int类型覆盖区间内),直接将实体类中PERSON_CODE的类型从decimal改为int即可,EF查询时会自动完成类型映射,JSON序列化后自然不会带小数后缀。
如果字段允许为null,将类型改为可空整型int?即可。
修改后的实体代码:

public class VW_PERSONS
{
    [Key]
    public int PERSON_CODE { get; set; }

    public string PERSON_NAME { get; set; }
}

方案2:自定义JSON转换器(不修改原有实体类型场景使用)

如果项目其他模块依赖该字段的decimal类型,无法直接修改属性类型,可以给JSON序列化器添加自定义转换规则:当decimal值的小数位为0时,序列化为整数格式,否则保留原有decimal输出。

若使用System.Text.Json(.NET Core 3.0+默认序列化器)

先编写自定义转换器:

public class DecimalToIntConverter : 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)
    {
        if (value == Math.Floor(value))
        {
            writer.WriteNumberValue((long)value);
        }
        else
        {
            writer.WriteNumberValue(value);
        }
    }
}

可以直接将转换器标记在对应属性上生效:

public class VW_PERSONS
{
    [Key]
    [JsonConverter(typeof(DecimalToIntConverter))]
    public decimal PERSON_CODE { get; set; }

    public string PERSON_NAME { get; set; }
}

也可以全局注册转换器,让所有decimal类型返回值自动应用该规则。

若使用Newtonsoft.Json(旧版.NET Framework Web API默认序列化器)

编写对应版本的自定义转换器:

public class DecimalToIntConverter : JsonConverter
{
    public override bool CanConvert(Type objectType) => objectType == typeof(decimal);

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

    public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
    {
        decimal d = (decimal)value;
        if (d == Math.Floor(d))
        {
            writer.WriteValue((long)d);
        }
        else
        {
            writer.WriteValue(d);
        }
    }
}

同样支持属性标记或全局注册两种生效方式。

方案3:业务层映射时手动转换

如果不想修改实体定义、也不想调整全局序列化配置,可以在业务逻辑层做模型映射时,手动将decimal值转为int后赋值给返回模型字段。比如你代码中返回ContatoModel时,直接在构造函数或赋值逻辑中写PERSON_CODE = (int)vwData.PERSON_CODE即可,最终返回值就是纯整数格式。


额外注意:你贴出的代码中控制器方法入参类型为decimal PERSON_CODE,但业务层方法签名的入参是string PERSON_CODE,这里参数类型不匹配,实际运行会抛异常,需要统一参数类型。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 06:48:15