可以使用Rational
和printf
在%s
输出中简单地包含show
:
> printf "... %s ...\n" (show $ 123 % 456)
... 41 % 152 ...
但是,也可以使用%f
格式的代码会很有用:
> printf "... %.30f ...\n" (123 % 456)
... 0.269736842105263157894736842105 ...
请注意,通过转换为Double
进行格式化(例如,使用fromRational
)将不允许我正在寻找的任意精度:
> printf "... %.30f ...\n" (fromRational $ 123 % 456)
... 0.269736842105263160000000000000 ...
%v
代码可用于产生与show
相同的输出,并且也许可以使用一些修饰符。
有什么理由不应该使用自定义格式化程序(PrintfArg (Ratio a)
的实例)来完成此操作吗?
作为参考,这是一个我用作部分解决方法的独立功能:
showDecimal :: RealFrac a => Int -> a -> String
showDecimal n r = printf "%d.%0*d" (i :: Integer) n (abs d :: Integer)
where (i, d) = (round $ r * 10^n) `quotRem` (10^n)
> printf "... %35s ...\n" (showDecimal 30 $ 123 % 456)
... 0.269736842105263157894736842105 ...
但是,这不允许使用修饰符,并且需要在单独的位置指定宽度。
答案 0 :(得分:1)
评论中的共识似乎是,因为没有人写一个,这似乎是个好主意。
我正在回答自己的问题,因此可以将其标记为已回答。如果我或其他任何人可以实施它,我会添加评论。