In einem Programm berechne ich einen Prozentsatz und drucke es für den Benutzer aus. Das Problem besteht darin, dass der gedruckte Prozentsatz mit zu vielen Dezimalstellen angezeigt wird. Ich suchte nach einer Funktion, die dieses Problem anspricht, fand keine und programmierte die Rundungsfunktion unten, aber ich frage mich, ob es stattdessen einen Standard-Weg gibt, dies zu tun. Auch die in this Java topic beschriebene Idee ist ziemlich ordentlich, und wenn es bereits Funktionen gibt, würde ich es gerne wissen.Haskell: Wie kann man einen Prozentsatz von bis zu zwei Dezimalstellen richtig anzeigen?
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"
Update: Eine vollständigere Version folgt, entwickelt, dank der Antworten, die ich erhalten habe.
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