返回 JSON 数据时是不是可以自定义小数精度?
Posted
技术标签:
【中文标题】返回 JSON 数据时是不是可以自定义小数精度?【英文标题】:Is it possible to have a custom decimal precision when returning JSON data?返回 JSON 数据时是否可以自定义小数精度? 【发布时间】:2017-06-27 14:44:06 【问题描述】:我有一个 webapi 返回一个金额(简化示例):
所以它可以返回例如:
Amount:40
Amount:40.1
Amount:40.15
是否可以始终返回带有 2 位小数的数字:
Amount:40.00
Amount:40.10
Amount:40.15
【问题讨论】:
如果您使用 Json.Net,this 可能是解决方案。40.00
是数字的格式。号码相同40
@SergeyBerezovskiy 我同意它是一样的,只是想知道它是否可能(我不想返回一个字符串)
为什么要这样做而不是使用 UI 代码处理格式化?
号码。自己测试很容易,但你可以去:i.stack.imgur.com/BLz1c.png
【参考方案1】:
您可以使用自定义转换器将每个十进制值四舍五入为给定的小数位数:
public class JsonDecimalConverter : JsonConverter
private int decimals;
public JsonDecimalConverter(int decimals = 2)
this.decimals = decimals;
public override bool CanConvert(Type objectType) => objectType == typeof(decimal);
public override object ReadJson(JsonReader reader,
Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public override void WriteJson(JsonWriter writer,
object value, JsonSerializer serializer)
writer.WriteValue(Decimal.Round((decimal)value, decimals));
用法:
var thing = new Thing Amount = 40.12345M, Name = "Foo" ;
var json = JsonConvert.SerializeObject(thing, new JsonDecimalConverter());
输出:
"Amount": 40.12,
"Name": "Foo"
请注意,这将为您提供40
十进制数40
。因为没有要存储的有意义的数字。 40.00
是一个字符串格式问题,您应该在要显示或存储此十进制表示的位置处理它。
【讨论】:
显然@stuartd 提供了一个即使是 40 也可以工作的示例:i.stack.imgur.com/BLz1c.png @ibiza 好吧,Json NET 将值输出为数字对我来说有点令人惊讶。但是你在这里获得的只是更大的 json。在您使用此 json 并对其进行反序列化后,40.00
的零值将消失。要输出这些零,您无论如何都需要格式化数字【参考方案2】:
你只需要使用
decimal.Round(myDecimalValue, 2)
【讨论】:
但是如果我想继续返回一个数字(不是字符串),有可能吗? 你的值是小数还是双精度? 金额为小数 这只有在实际有 2 个或更多十进制值时才有效。 2 将返回 2,2.1 将返回 2.1。以上是关于返回 JSON 数据时是不是可以自定义小数精度?的主要内容,如果未能解决你的问题,请参考以下文章
SpringMVC3.2 解决PO返回前台转成JSON时数据Long精度丢失问题