如何将 Web api 十进制结果格式化为两个小数点空格
本文关键字:两个 空格 小数点 格式化 Web api 结果 十进制 | 更新日期: 2024-11-05 22:27:52
如何将 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