我正在寻找一种惯用(也许是内置)方法,用左边的零填充整数的字符串表示。
在我的情况下,整数从不超过99,所以
fix r = if length r == 1 then '0':r else r
fix.show <$> [1..15]
的工作原理。但我希望有更好的方法。
如何在Haskell中填充整数的字符串表示形式?
答案 0 :(得分:13)
printf
样式格式可通过Text.Printf
模块获取:
import Text.Printf
fmt x = printf "%02d" x
或者特殊情况下格式为0:
fmt 0 = " "
fmt x = printf "%02d" x
答案 1 :(得分:6)
> (\x -> replicate (3 - length x) '0' ++ x) "2"
"002"
> (\x -> replicate (3 - length x) '0' ++ x) "42"
"042"
> (\x -> replicate (3 - length x) '0' ++ x) "142"
"142"
> (\x -> replicate (3 - length x) '0' ++ x) "5142"
"5142"
以上内容利用了replicate
在负参数上返回空字符串的事实。
答案 2 :(得分:3)
为了完整起见,我在这里添加了一个程序填充任何字符串列表,其中一个字符作为参数传递。
我使用circular programming的实例,而不是从get get中获取最大长度:如果你仔细观察,你会发现n
是计算的结果。在其中使用它!
pad :: Char -> [String] -> [String]
pad c xs = ys where
(ys, n) = foldr cons ([],0) xs
cons x (acc, m) = ((replicate (n - m') c ++ x) : acc, max m m')
where m' = length x
答案 3 :(得分:1)
怎么样
pad0 n x = take (n - length sx) (cycle "0") ++ sx
where sx = show x
pad0 3 1
=> "001"
pad0 3 11
=> "011"
pad0 3 111
=> "111"
["COMP" ++ pad0 3 x | x <- [1..8] ]
=> ["COMP001","COMP002","COMP003","COMP004","COMP005","COMP006","COMP007","COMP008"]