Ответ 1
Только для записи:
import Numeric
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""
Используя следующий фрагмент кода:
(fromIntegral 100)/10.00
Используя стандартную прелюдию Haskell '98, как представить результат с двумя десятичными знаками?
Спасибо.
Только для записи:
import Numeric
formatFloatN floatNum numOfDecimals = showFFloat (Just numOfDecimals) floatNum ""
Вы можете использовать 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"