如何将Web API十进制结果格式设置为两位小数 - c#

如何将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
}

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

参考方案

您可以尝试使用自定义实现替换默认格式器(在您的情况下为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配置中的formatters集合中:

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

当回复有时是一个对象有时是一个数组时,如何在使用改造时解析JSON回复? - java

我正在使用Retrofit来获取JSON答复。这是我实施的一部分-@GET("/api/report/list") Observable<Bills> listBill(@Query("employee_id") String employeeID); 而条例草案类是-public static class…

Mongo汇总 - javascript

我的收藏中有以下文件{ "_id": ObjectId("54490b8104f7142f22ecc97f"), "title": "Sample1", "slug": "samplenews", "cat": …

如何在Wiremock中为JUNIT匹配精确的json - java

我正在使用Wiremock在Spring启动应用程序中模拟Junit的REST服务。我的问题是,我无法匹配多个匹配模式。 Junit.javaStringValuePattern pattern = WireMock.matching(".*"); givenThat(post(urlEqualTo("/softwares�…

如何在JQuery中操作JSONArray - javascript

我有一个php函数,它以JSON返回此代码{"0":{"title":"Dans l\u2019appartement"},"1":{"title":"A l\u2019a\u00e9roport - D\u00e9part de B\u00e9at…

如何使用C#仅从多层嵌入式MongoDB文档中获取具有相应父元素的确切子元素 - c#

尝试使用C#从嵌入式MongoDB文档中获取确切的子文档及其对应的父文档,但查询返回所有子文档以及对应的父文档和其他文档。如何将参数设置为使用Filter和findOptions获得完全匹配。我的预期结果是频道1->第1集,并且是给定ID的Child Track。这是我的代码:// Class namespace CrudWithMultilvelNe…