【问题标题】:Serialize a decimal to a human readable currency format将小数序列化为人类可读的货币格式
【发布时间】:2015-03-10 13:32:36
【问题描述】:

我正在使用json.net 库来序列化一个对象,该对象具有代表成本的十进制值。序列化时,我希望 json 看起来像 '$400,000' 而不是 '400000.0'

有没有一种方法可以让我轻松高效地完成此任务?此对象包含许多其他次要对象和后续属性。

应用程序将在本地使用,并且规范说输出应该是人类可读的格式。在这种情况下,文化差异并不重要。

【问题讨论】:

  • 为什么? JSON 是一种电子 交换格式,不一定是为了可读性而设计的。如果您想要格式化值,请使用 string 而不是 decimal
  • 我同意除了不变的文化之外不要序列化。如果NumberFormatInfo.CurrencyGroupSeparator 是,比如说,“。”怎么办?就像欧洲大部分地区一样?你是在当前的文化中连载,这样对于编写文件的人来说都是正确的,还是你连载它,比如说,“en-US”,疏远那些不使用美元的人,那些不使用美元的人'不使用逗号等?一旦您格式化 数据以对其进行序列化,您就会向一个充满伤害的世界敞开大门。 (我说的是经验)。
  • 您需要将您的属性序列化为字符串,因为JSON standard for numerical values 非常简单,文化不变,并且不允许任何类型的货币前缀。此外,@WaiHaLee 的第二个警告是,您可能会创建一个其他地区的人无法读取的文件。
  • 尝试查看Humanizer。它几乎可以将任何东西转换为人类可读的格式。不过,专门针对您的场景,您可以 ToString("C")

标签: c# json serialization currency


【解决方案1】:

没有简单的方法来执行此操作,因为您无法解决序列化程序直接访问您的属性的事实。

如果您需要格式化的 JSON 输出,我建议您编写一个帮助类来包装您要公开的类。不幸的是,我为一些 XML 报告做过一次,最简单的方法是这样的:

class PersonXml
{
   Person _person;

   void PersonXml(Person person) { _person = person; }

   string Age { get { return _person.Age + " years"; } }
}

这只是我临时写的一个简单示例,但原理始终相同。即使某些高级 JSON 序列化程序为我提供了格式化输出的方法,我仍然会将这个概念与我的主要对象放在一个带有单独帮助程序类的单独文件中。

同样,这不是完全解决方案,在我看来,它永远不应该出现这种情况,但如果确实如此,那么在我的经验中,这是较小的弊端。

另外,请注意,如果您在属性 getter 中引用该类,则存在空引用的危险。

【讨论】:

    【解决方案2】:

    正如 D Stanley 建议的那样,我将字段类型从十进制更改为字符串,因为其中的数据仅被读取而不用于数据操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-05-03
      • 2018-01-07
      • 2017-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多