gpt4 book ai didi

haskell - 在 aeson 中,如何从 Value 编码而不产生科学记数法?

转载 作者:行者123 更新时间:2023-12-04 19:00:07 25 4
gpt4 key购买 nike

我已经解析了大量的 json,操纵了一些值,我想把它写回来。 Aeson 将数字解码为科学数字,但是当它对数字进行编码时,默认情况下,科学数字在许多情况下以科学记数法显示,而 aeson 没有提供任何我可以看到的方法来改变它。

> decode "[\"asdf\", 1, 1.0, 1000000000.1, 0.01]" :: Maybe Value
Just (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])

encode (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
"[\"asdf\",1,1,1.0000000001e9,1.0e-2]"

> encode (Array [String "asdf", Number 1, Number 1.0, Number 1000000000.1, Number 0.01])
"[\"asdf\",1,1,1.0000000001e9,1.0e-2]"

如何以其他语言可以使用的更广泛接受的格式用数字写出我的值(value)?假设我不关心精度损失或整数溢出。科学包具有以这种方式格式化数字的方法,只是 aeson 没有使用它。
>formatScientific Fixed Nothing (0.01)
"0.01"

>formatScientific Fixed Nothing (1000000000.1)
"1000000000.1"

最佳答案

pretty printer for Aeson (仅从 0.8 版开始,最近)有一个配置选项,可以完全满足您的要求:

Prelude> :m +Data.Aeson Data.Aeson.Encode.Pretty 
Prelude Data.Aeson Data.Aeson.Encode.Pretty> encodePretty' (defConfig{confNumFormat=Decimal}) (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
"[\n \"asdf\",\n 1.0,\n 1.0,\n 1000000000.1,\n 0.01\n]"

不幸的是,这个 pretty-print 现在将实际整数输出为 1.0而不是 1 ,我认为这是一个比用科学记数法打印小数更严重的问题(这在任何地方都应该没问题)。默认设置也会发生这种情况:
Prelude Data.Aeson Data.Aeson.Encode.Pretty> encodePretty (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
"[\n \"asdf\",\n 1.0,\n 1.0,\n 1.0000000001e9,\n 1.0e-2\n]"

0.7.2 版本仍然打印没有小数部分的整数,就像普通的 aeson encode做:
aeson-pretty-0.7.2:Data.Aeson.Encode.Pretty> encodePretty (Array [String "asdf",Number 1.0,Number 1.0,Number 1.0000000001e9,Number 1.0e-2])
"[\n \"asdf\",\n 1,\n 1,\n 1.0000000001e9,\n 1.0e-2\n]"

我想我会将此作为错误报告提交。

请注意,还有一个 Custom NumberFormat选项,它使您可以完全控制数字的显示方式。

关于haskell - 在 aeson 中,如何从 Value 编码而不产生科学记数法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39375641/

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