如何将Rational转换为"漂亮"的字符串?

Mik*_*cki 7 formatting rational-number haskell

我想Rational在它们的十进制扩展中显示一些值.也就是说3 % 4,我宁愿显示,而不是显示0.75.我希望这个功能是类型的Int -> Rational -> String.第一种Int是指定最大小数位数,因为Rational扩展可能是非终止的.

HoogleData.Ratio黑线鳕没有帮助我.我在哪里可以找到这个功能?

Ale*_*lec 9

你可以做到.不优雅,但做的工作:

import Numeric
import Data.Ratio

display :: Int -> Rational -> String
display n x = (showFFloat (Just n) $ fromRat x) ""
Run Code Online (Sandbox Code Playgroud)


xny*_*hps 7

这是一个不使用浮点数的任意精度解决方案:

import Data.Ratio

display :: Int -> Rational -> String
display len rat = (if num < 0 then "-" else "") ++ (shows d ("." ++ take len (go next)))
    where
        (d, next) = abs num `quotRem` den
        num = numerator rat
        den = denominator rat

        go 0 = ""
        go x = let (d, next) = (10 * x) `quotRem` den
               in shows d (go next)
Run Code Online (Sandbox Code Playgroud)


Dan*_*ner 6

重新使用库代码的任意精度版本:

import Data.Number.CReal

display :: Int -> Rational -> String
display digits num = showCReal digits (fromRational num)
Run Code Online (Sandbox Code Playgroud)

我知道我之前看到过一个函数,它将理性转换为数字的方式更容易检查(即,这使得数字开始重复的位置非常清楚),但我现在似乎无法找到它.无论如何,如果结果是需要的话,写起来并不难; 你只需编写通常的长除法算法,并观察你已经完成的划分.