gpt4 book ai didi

c# - 如何在 Json.net 中强制保留最小小数位数?

转载 作者:可可西里 更新时间:2023-11-01 08:21:50 30 4
gpt4 key购买 nike

当我使用 json.net 将小数写入 json 时,我遇到了一个恼人的不一致问题。有时是 1 dp,有时是 2。

显然我知道将小数输出到具有一定小数位数的字符串的解决方案,例如 this ,但我想如果不编写自定义序列化程序,您就无法使用 json.net 进行控制。

我也知道 Math.Round 强制执行最大 小数位数,这个问题与强制执行最小小数位数有关。

前两个测试显示了正在发生的事情,它保留了声明或计算中的原始小数位数。

我发现我可以添加然后减去一小部分,接下来的两个测试显示它有效,但是有没有更简洁的方法?

[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());

关于c# - 如何在 Json.net 中强制保留最小小数位数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34568963/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com