module Utility.HumanNumber where
showImprecise :: RealFrac a => Int -> a -> String
showImprecise :: Int -> a -> String
showImprecise precision :: Int
precision n :: a
n
| Int
precision Int -> Int -> Bool
forall a. Eq a => a -> a -> Bool
== 0 Bool -> Bool -> Bool
|| Integer
remainder Integer -> Integer -> Bool
forall a. Eq a => a -> a -> Bool
== 0 = Integer -> String
forall a. Show a => a -> String
show (a -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
round a
n :: Integer)
| Bool
otherwise = Integer -> String
forall a. Show a => a -> String
show Integer
int String -> String -> String
forall a. [a] -> [a] -> [a]
++ "." String -> String -> String
forall a. [a] -> [a] -> [a]
++ String -> String
striptrailing0s (String -> String
pad0s (String -> String) -> String -> String
forall a b. (a -> b) -> a -> b
$ Integer -> String
forall a. Show a => a -> String
show Integer
remainder)
where
int :: Integer
(int :: Integer
int, frac :: a
frac) = a -> (Integer, a)
forall a b. (RealFrac a, Integral b) => a -> (b, a)
properFraction a
n
remainder :: Integer
remainder = a -> Integer
forall a b. (RealFrac a, Integral b) => a -> b
round (a
frac a -> a -> a
forall a. Num a => a -> a -> a
* 10 a -> Int -> a
forall a b. (Num a, Integral b) => a -> b -> a
^ Int
precision) :: Integer
pad0s :: String -> String
pad0s s :: String
s = Int -> Char -> String
forall a. Int -> a -> [a]
replicate (Int
precision Int -> Int -> Int
forall a. Num a => a -> a -> a
- String -> Int
forall (t :: * -> *) a. Foldable t => t a -> Int
length String
s) '0' String -> String -> String
forall a. [a] -> [a] -> [a]
++ String
s
striptrailing0s :: String -> String
striptrailing0s = String -> String
forall a. [a] -> [a]
reverse (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (Char -> Bool) -> String -> String
forall a. (a -> Bool) -> [a] -> [a]
dropWhile (Char -> Char -> Bool
forall a. Eq a => a -> a -> Bool
== '0') (String -> String) -> (String -> String) -> String -> String
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> String
forall a. [a] -> [a]
reverse