diff options
author | Joey Hess <joey@kitenet.net> | 2012-04-29 17:48:07 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-04-29 17:48:07 -0400 |
commit | 0c9c14b52fcdd9684da70c8dd763661acdbd3843 (patch) | |
tree | 410c489f196bb4723cdd5ae4c634a2fcefee7c88 /Utility | |
parent | d2bfba6324ca54253be62716b1bbdc86e0e1aafe (diff) |
percentage library
Diffstat (limited to 'Utility')
-rw-r--r-- | Utility/Percentage.hs | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/Utility/Percentage.hs b/Utility/Percentage.hs new file mode 100644 index 000000000..309e00181 --- /dev/null +++ b/Utility/Percentage.hs @@ -0,0 +1,38 @@ +{- percentages + - + - Copyright 2012 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.Percentage ( + Percentage, + percentage, + showPercentage +) where + +import Data.Ratio + +newtype Percentage = Percentage (Ratio Integer) + +instance Show Percentage where + show = showPercentage 0 + +{- Normally the big number comes first. But 110% is allowed if desired. :) -} +percentage :: Integer -> Integer -> Percentage +percentage 0 _ = Percentage 0 +percentage full have = Percentage $ have * 100 % full + +{- Pretty-print a Percentage, with a specified level of precision. -} +showPercentage :: Int -> Percentage -> String +showPercentage precision (Percentage p) + | precision == 0 || remainder == 0 = go $ show int + | otherwise = go $ show int ++ "." ++ strip0s (show remainder) + where + go v = v ++ "%" + int :: Integer + (int, frac) = properFraction (fromRational p) + remainder = floor (frac * multiplier) :: Integer + strip0s = reverse . dropWhile (== '0') . reverse + multiplier :: Float + multiplier = 10 ** (fromIntegral precision) |