Вы можете использовать printf :: PrintfType r => String -> r
из Text.Printf
:
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
форматирует второй аргумент как число с плавающей запятой. %.2f
указывает, что должны быть напечатаны только две цифры после десятичной точки. \n
представляет новую строку. Это не обязательно для этого примера.
Обратите внимание, что эта функция возвращает значение типа String
или IO a
, в зависимости от контекста. Демонстрация:
Prelude Text.Printf> printf "%.2f" (1337 :: Float) ++ " is a number"
"1337.00 is a number"
В этом случае printf
возвращает строку "1337.00"
, потому что результат передается в качестве аргумента (++)
, который является функцией, которая ожидает аргументы списка (обратите внимание, что String
совпадает с [Char]
). Таким образом, printf
также ведет себя как sprintf
в других языках. Конечно, такой трюк, как добавление второй строки, не нужен. Вы можете просто явно указать тип:
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: IO a
1337.00
Prelude Text.Printf> printf "%.2f\n" (1337 :: Float) :: String
"1337.00\n"