在Haskell中,如何打印浮点列表(或Fractional
)并指定格式?例如。 putStrLn $ magic "%.2f" [3.14159]
应打印[3.14]
。
正如here指出的那样,有Text.Printf (printf)
,但我不知道如何将其与列表一起使用?
“行之有效”的一件事是
printf' :: [Double] -> [String]
printf' l = map (\x -> printf "%.2f" x) l
使用
main = do
putStrLn $ show (printf' [3.14159])
但这很可怕,必须有另一种方式。
this answer中针对类似问题的前两个示例根本不起作用。
答案here足够整洁,但正如指出的那样,它不是类型安全的,而且会中断Read
/ Show
互操作。
还有其他选择吗?谢谢。
答案 0 :(得分:3)
您可以使用intercalate :: [a] -> [[a]] -> [a]
在元素之间加上逗号,并进行一些附加的列表处理,以在前面添加'['
,在末尾添加']'
,例如:< / p>
import Data.List(intercalate)
main :: IO ()
main = putStrLn ('[' : intercalate "," (printf' [3.14159]) ++ "]")
然后产生:
Prelude Text.Printf Data.List> main
[3.14]
请注意,您可以将printf'
简化为:
printf' :: [Double] -> [String]
printf' = map (printf "%.2f")
答案 1 :(得分:3)
您可以导入数值库来实现此目的。我已经快速编写了一个小程序作为示例,而没有使用printf函数。
module Main where
import Numeric
main :: IO ()
main = putStrLn "hello world"
a = [1.111, 2.2222222222222, 3.33333333333333333333333]
printList :: [Double] -> [String]
printList xs = map format xs
format :: Double -> String
format x = showFFloat (Just 2) x ""
简单调用printList a
将导致:
["1.11","2.22","3.33"]