<div dir="ltr"><div>It just is so convenient.</div><div><br></div><div>instance (Integral a, Show a) => PrintfArg (Ratio a) where<br>    formatArg x f@(FieldFormat w p a s l _ c) = if elem c "gGv"<br>        then showsPrec 0 x<br>        else if elem c "doxXb"<br>            then formatArg (round x :: Integer) (f {fmtPrecision = Nothing, fmtChar = 'd'})<br>            else case p of <br>                Nothing -> error "Text.Printf.formatArg: precision not given"<br>                Just p' -> if p' <= 0<br>                    then formatArg x (f {fmtPrecision = Nothing, fmtChar = 'd'})<br>                    else if elem c "fF"<br>                        then let<br>                            n = truncate x<br>                            sig = '.' : goF (x - fromInteger n) p'<br>                            b = case a of<br>                                Just ZeroPad -> formatArg n (f {fmtWidth = fmap (subtract (length sig)) w, fmtPrecision = Nothing, fmtChar = 'd'}) ""<br>                                _ -> show n<br>                            in formatArg (b ++ sig) (f {fmtPrecision = Nothing, fmtChar = 's'})<br>                        else if elem c "eE"<br>                            then let<br>                                (q,e) = log10 x<br>                                sig = c : show e<br>                                a' = case a of<br>                                    Just ZeroPad -> a<br>                                    _ -> Nothing<br>                                fp = formatArg q (f {fmtWidth = fmap (subtract (length sig)) w, fmtAdjust = a', fmtChar = 'f'}) ""<br>                                in formatArg (fp ++ sig) (f {fmtPrecision = Nothing, fmtChar = 's'})<br>                            else error "Text.Printf.formatArg: bad format character"<br>      where<br>        goF _ 0 = ""<br>        goF x p = case compare x 0 of<br>            LT -> '-' : goF (negate x) p<br>            EQ -> "0"<br>            GT -> if 1 == p<br>                then show (round (10 * x) :: Integer)<br>                else let<br>                    x10 = 10 * x<br>                    n = truncate x10<br>                    in show n ++ goF (x10 - fromIntegral n) (p - 1)<br>        log10 x<br>            | x < 1 = let<br>                (q,e) = log10 (x * 10)<br>                in (q, e - 1)<br>            | 10 <= x = let<br>                (q,e) = log10 (x / 10)<br>                in (q, e + 1)<br>            | otherwise = (x, 0)<br></div><br></div>