如何将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
}
请注意我不想更改返回类型
答案 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