如何强制NewtonSoft Json Serializer以相同的方式序列化两位小数?
decimal a = 1234.1200M;
decimal b = 1234.12M;
var sa = JsonConvert.SerializeObject(new { value = a });
var sb = JsonConvert.SerializeObject(new {value = b});
Console.WriteLine(sa);
Console.WriteLine(sb);
结果是: { “值”:1234.1200} { “值”:1234.12}
如何强制它将它们序列化为4位小数,以便结果相同?
答案 0 :(得分:0)
您可以按如下方式格式化小数:
var sa = JsonConvert.SerializeObject(new { value = a.ToString("#.#000") });
var sb = JsonConvert.SerializeObject(new { value = b.ToString("#.#000") });
答案 1 :(得分:0)
我发现了一个"答案"稍微摆弄串行器之后:
private class JsonTextWriterOptimized : JsonTextWriter
{
public JsonTextWriterOptimized(TextWriter textWriter)
: base(textWriter)
{
}
public override void WriteValue(decimal value)
{
// we really really really want the value to be serialized as "0.0000" not "0.00" or "0.0000"!
value = Math.Round(value, 4);
// divide first to force the appearance of 4 decimals
value = Math.Round((((value+0.00001M)/10000)*10000)-0.00001M, 4);
base.WriteValue(value);
}
}
第一个Math.Round将在第4个之后删除任何小数。 值+ 0.00001M已完成,因此100之类的数字变为100.00001。然后我们乘以和除。所有这一切使小数点坚持4位小数。我们然后四舍五入以确保我们通过+0.00001添加的第五个小数消失了。 这似乎适用于我投入的任何价值观。
然后使用自定义编写器:
var jsonSerializer = Newtonsoft.Json.JsonSerializer.Create();
var sb = new StringBuilder(256);
var sw = new StringWriter(sb, CultureInfo.InvariantCulture);
using (var jsonWriter = new JsonTextWriterOptimized(sw))
{
jsonWriter.Formatting = Formatting.None;
jsonSerializer.Serialize(jsonWriter, instance);
}
我也修正了自己的答案(我忘记了这个问题): Serializing a decimal to JSON, how to round off?