如何在Haskell中填充整数的字符串表示?

时间:2015-08-31 12:36:43

标签: string haskell formatting

我正在寻找一种惯用(也许是内置)方法,用左边的零填充整数的字符串表示。

在我的情况下,整数从不超过99,所以

fix r = if length r == 1 then '0':r else r
fix.show <$> [1..15]

的工作原理。但我希望有更好的方法。

如何在Haskell中填充整数的字符串表示形式?

4 个答案:

答案 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"]