如何将 Web api 十进制结果格式化为两个小数点空格



如何将 web api 十进制结果格式化为两个小数点空格?

我有一个应该返回数字"15321.39"的 web api 方法。但是返回的值是 15321.3900

我的代码示例是:

    [Route("GetDecimalValue")]
    [ResponseType(typeof(decimal))]
    [HttpGet]
    public IHttpActionResult GetDecimal()
    {
        try
        {
            decimal result = GetMyNumber(); // returns number such as 15321.39
            return Ok(result);
        }
        catch (Exception ex)
        {
            return InternalServerError(ex);
        }
    } 
public decimal GetMyNumber(){
   return 15321.39m
}

请注意我不想更改返回类型

您可以尝试直接设置小数位数:

        decimal result = 15321.39m;
        var stringResult = result.ToString("F2");

或者尝试将其四舍五入(如果您不想返回字符串):

        var roundedResult = Math.Round(result, 2);

现在,您将代码更改为返回小数,15321.39 和 15321.3900 之间没有区别。 也就是说,您不会将 DECIMAL 格式化为任意数量的位。 当您转到显示输出时,您可以格式化输出。 因此,您必须更改使用该十进制返回值的代码,并仅以两位小数显示它。 这不是 API 中的问题,现在是使用 API 的代码中的问题,以确保它在显示返回值时使用正确数量的小数。

您可以尝试将十进制类型的默认格式化程序(在您的例子中为 JsonFormatter)替换为自定义实现。这是全局应用的,并且适用于您将用作任何NegotiatedContentResult参数的每个小数(例如,对于示例中的Ok方法,它将开箱即用)。

首先创建一个新的 MediaType格式化程序:

public class MyDecimalFormatter : MediaTypeFormatter
{
    public MyDecimalFormatter()
    {
        SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/json"));
        SupportedEncodings.Add(Encoding.UTF8);
    }
    public override bool CanReadType(Type type)
    {
        return false;
    }
    public override bool CanWriteType(Type type)
    {
        return type == typeof(decimal);
    }
    public override Task WriteToStreamAsync(Type type, object value, Stream writeStream, HttpContent content,
        TransportContext transportContext)
    {
        var decimalValue = (decimal)value;
        var formatted = decimalValue.ToString("F2", CultureInfo.InvariantCulture);
        using (var writer = new StreamWriter(writeStream))
        {
            writer.Write(formatted);
        }
        return Task.FromResult(0);
    }
}

然后将其作为第一个添加到 Web API 配置中的格式化程序集合:

config.Formatters.Insert(0, new MyDecimalFormatter());

您可以在WebApiConfig.cs Register方法中添加此行,也可以在Global.asax/Startup.cs 中添加此行。

此方法与result.ToString()的区别

只需在操作中使用.ToString()

行动:

//..
decimal result = GetMyNumber();
return Ok(result.ToString("F2")); //Ok receives a string as argument

HTTP 响应正文:

"15321.39" //This is a JSON string, not a number

使用自定义MediaTypeFormatter

行动:

//..
decimal result = GetMyNumber();
return Ok(result); //Ok recives a decimal as argument

HTTP 响应正文:

15321.39 //This is a JSON number

最新更新