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

时间:2016-04-22 11:52:29

标签: c# asp.net-web-api2

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

我有一个web api方法,应该返回数字'15321.39'。 但是返回的值是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
}

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

3 个答案:

答案 0 :(得分:2)

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

        decimal result = 15321.39m;

        var stringResult = result.ToString("F2");

或尝试绕圈(如果你不想返回字符串):

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

答案 1 :(得分:2)

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

答案 2 :(得分:1)

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

首先创建一个新的MediaTypeFormatter:

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