W programie obliczam procent i drukuję go użytkownikowi. Problem polega na tym, że wydrukowany procent jest pokazany ze zbyt dużą liczbą miejsc po przecinku. Szukałem funkcji zajmującej się tym problemem, nie znalazłem ani nie zaprogramowałem funkcji zaokrąglania poniżej, ale zastanawiam się, czy istnieje bardziej standardowy sposób, aby to zrobić. Pomysł opisany w this Java topic jest całkiem czysty, a jeśli już istnieją funkcje do tego, chciałbym to wiedzieć.Haskell: jak prawidłowo wyświetlać wartość procentową do dwóch miejsc po przecinku?
roundTo :: (Integral int1, Integral int2) => int1 -> Double -> Either int2 Double
roundTo digitsAfterComma value
| (digitsAfterComma >= 1) =
let
factor = fromIntegral (10^digitsAfterComma)
result = ((/ factor) . fromIntegral . round . (* factor)) value
in
Right result
| (digitsAfterComma == 0) = Left (round value)
| otherwise = error "minimal precision must be non-negative"
Aktualizacja: Poniżej znajduje się bardziej kompletna wersja, opracowana dzięki odpowiedziom, które otrzymałem.
import qualified Text.Printf as T
showPercentage :: (Integral a, Show a) => a -> Double -> String
showPercentage digitsAfterComma fraction
| (digitsAfterComma >= 1) =
let formatString = "%." ++ (show digitsAfterComma) ++ "f%%"
in T.printf formatString percentage
| (digitsAfterComma == 0) =
let formatString = "%d%%"
in T.printf formatString (round percentage :: Int)
| otherwise = error "minimal precision must be non-negative"
where percentage = 100 * fraction