当我使用 json.net 将小数写入 json 时,遇到了恼人的不一致问题。有时为 1 dp,有时为 2。
显然我知道将小数输出到具有一定小数位数的字符串的解决方案,例如this https://stackoverflow.com/a/164932/360211,但我猜如果不编写自定义序列化程序,您就无法使用 json.net 进行控制。
我也知道Math.Round
强制执行maximum小数位数,这个问题涉及强制执行最小小数位数。
前两个测试显示了发生的情况,它保留了声明或计算中的原始小数位数。
我发现我可以添加然后减去一小部分,接下来的两个测试表明它有效,但是有没有更干净的方法?
[TestFixture]
public sealed class DecimalPlaces
{
public class JsonType
{
public decimal Value { get; set; }
}
[Test]
public void TwoDp()
{
var obj = new JsonType { Value = 1.00m };
Assert.AreEqual("{\"Value\":1.00}", JsonConvert.SerializeObject(obj));
}
[Test]
public void OneDp()
{
var json = new JsonType { Value = 1.0m };
Assert.AreEqual("{\"Value\":1.0}", JsonConvert.SerializeObject(obj));
}
private decimal ForceMinimumDp(decimal p, int minDecimalPlaces)
{
decimal smallFrac = 1m/((decimal)Math.Pow(10, minDecimalPlaces));
return p + smallFrac - smallFrac;
}
[Test]
public void ForceMinimumTwoDp()
{
var obj = new JsonType { Value = ForceMinimumDp(1.0m, 2) };
Assert.AreEqual("{\"Value\":1.00}", JsonConvert.SerializeObject(obj));
}
[Test]
public void ForceMinimumThreeDp()
{
var obj = new JsonType { Value = ForceMinimumDp(1.0m, 3) };
Assert.AreEqual("{\"Value\":1.000}", JsonConvert.SerializeObject(obj));
}
}
您可以使用自定义 JSON 转换器来完成此操作:
class DecimalJsonConverter : JsonConverter
{
public override bool CanConvert(Type objectType)
{
return 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.WriteRawValue(((decimal) value).ToString("F2", CultureInfo.InvariantCulture));
}
}
这是一个非常基本的转换器。您可能需要扩展它以支持其他浮点类型,甚至也可能支持整数类型。
现在实例化您的序列化程序并将其传递给您的自定义转换器,如下所示:
var serializer = new JsonSerializer();
serializer.Converters.Add(new DecimalJsonConverter());
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)