2009-10-13 9 views

Antwort

51

Nur für das Protokoll:

import Numeric 
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum "" 
+9

IMO diese Antwort sollte die akzeptierte sein. –

+0

@NikitaVolkov Fertig. Besser spät als nie ;-) – Anders

22

Sie können printf :: PrintfType r => String -> r von Text.Printf verwenden:

Prelude> import Text.Printf 
Prelude Text.Printf> printf "%.2f\n" (100 :: Float) 
100.00 
Prelude Text.Printf> printf "%.2f\n" $ fromIntegral 100/10.00 
10.00 

%f formatiert das zweite Argument als Gleitkommazahl. %.2f zeigt an, dass nur zwei Stellen hinter dem Dezimalpunkt gedruckt werden sollen. \n repräsentiert eine neue Zeile. Dies ist für dieses Beispiel nicht unbedingt erforderlich.

Beachten Sie, dass diese Funktion je nach Kontext einen Wert vom Typ String oder IO a zurückgibt. Demonstration:

Prelude Text.Printf> printf "%.2f" (1337 :: Float) ++ " is a number" 
"1337.00 is a number" 

In diesem Fall printf die Zeichenfolge "1337.00" zurückgibt, weil das Ergebnis als Argument an (++) übergeben wird, die eine Funktion ist, die Liste Argumente (beachten Sie, dass String die gleiche wie [Char] ist) erwartet. Daher verhält sich printf auch in anderen Sprachen als sprintf. Natürlich ist ein Trick wie das Anhängen einer zweiten Zeichenfolge nicht notwendig. Sie können nur explizit den Typ angeben:

Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: IO a 
1337.00 
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: String 
"1337.00\n" 
+2

Ich werde die Frage umformulieren :-) Ich möchte eine String-Darstellung eines Floats mit genau zwei Dezimalen zurückgeben - nicht auf stdout drucken. Ich kann in Haskell nichts Konkretes über eine Sprintf-Funktion finden, wie ich es mir erhofft hatte. Irgendwelche Hinweise? – Anders

+0

Guter Punkt. Ich habe meine Antwort aktualisiert. – Stephan202

+0

Versuchen Sie, den Schwimmer zu runden und dann zu drucken? –