当前位置: 首页 > 面试题库 >

如何在Json.net中强制使用最少的小数位数?

孟英锐
2023-03-14
问题内容

当我使用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());


 类似资料:
  • 问题内容: 我在Python中有一些实例。我希望格式化它们 因此,请确保始终至少保留两个小数位,甚至可能更多。虽然不存在舍入到小数位的解决方案的短缺,但我找不到找到确保数字下限的整洁方法。 我当前的解决方案是计算: 并选择两者中较长的一个。但是,它似乎有些骇人听闻。 问题答案: 如果您希望避免出现字符串问题: 未经测试的代码,但它 应该可以 工作。 这是这样的: d = 12.345 100倍 1

  • 我有一个非常长的字符串格式的数字,如下所示: 它实际上是一个unix时间戳,但是当我把它从日期对象转换成unix时间戳时,它就变成了一个字符串。 我需要将其转换为:1437925621.000,因此我编写了一个小代码,将小数点添加到字符串的正确位置。在这一点上,它仍然是一个字符串。 但是,它需要是一个浮点,以便比较,所以我将其转换为如下所示的浮点: 但是当我把它转换成浮点数时,它会砍掉小数点后的三

  • 我想强制总是有2个小数来输入会计数据。 我已经用JavaScript实现了这一点

  • 我试图用创建一个简单的折线图,当我尝试设置x轴和y轴的最小值/最大值时,这些值将不起作用。 我已经尝试了以下所有,但没有一个执行我指定的最小值和最大值: 第一次尝试: 第二次尝试: 第三次尝试: 但这些似乎都不起作用。我做错了什么/错过了什么?谢谢. 顺便说一下,我发现Chart.js文档非常混乱,而且很难在网上找到有效的示例,特别是因为Chart.js的v1和v2似乎根本不同。

  • 问题内容: 我正在使用matplotlib.pyplot模块绘制直方图,并且想知道如何强制y轴标签仅显示整数(例如0、1、2、3等)而不显示小数(例如0.,0.5) ,1,,1.5、2等)。 我正在查看指导说明,怀疑答案在matplotlib.pyplot.ylim周围,但是到目前为止,我只能找到设置最小和最大y轴值的东西。 问题答案: 如果你有y数据 您可以使用此数据的最大值和最小值来创建此范围

  • 问题内容: 我正在尝试为Express.js创建一个中间件,以将所有非安全(端口80)通信重定向到安全SSL端口(443)。不幸的是,Express.js请求中没有任何信息可让您确定该请求是否来自http或https。 一种解决方案是重定向 每个 请求,但这不是我的选择。 笔记: 没有可能用Apache或其他东西来处理它。它 必须 在节点中完成。 应用程序中只能启动 一台 服务器。 您将如何解决?