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

String 如何在Haskell中填充整数的字符串表示?,string,haskell,formatting,String,Haskell,Formatting,我正在寻找一种惯用的(可能是内置的)方法,用左边的零填充整数的字符串表示 在我的例子中,整数永远不会超过99 fix r = if length r == 1 then '0':r else r fix.show <$> [1..15] fix r=如果长度r==1,则为“0”:否则为r fix.show[1..15] 工作。但我希望有更好的办法 如何在Haskell中填充整数的字符串表示?printf可通过文本使用样式格式。printf模块: import Text.Print

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

在我的例子中,整数永远不会超过99

fix r = if length r == 1 then '0':r else r
fix.show <$> [1..15]
fix r=如果长度r==1,则为“0”:否则为r
fix.show[1..15]
工作。但我希望有更好的办法


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

printf
可通过
文本使用样式格式。printf
模块:

import Text.Printf

fmt x = printf "%02d" x
或在特殊情况下更改0的格式:

fmt 0 = "  "
fmt x = printf "%02d" x

上面利用了
replicate
返回负参数的空字符串这一事实。

为了完整起见,我在这里添加了一个程序,用作为参数传递的字符填充任何字符串列表

我使用了一个例子,而不是从一开始就取最大长度:如果仔细观察,你会发现
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
怎么样

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"]
pad0nx=take(n-长度sx)(循环“0”)++sx
其中sx=显示x
pad0 3 1
=> "001"
PAD0311
=> "011"
PAD03111
=> "111"
[“COMP”++pad0 3 x | x[“COMP001”、“COMP002”、“COMP003”、“COMP004”、“COMP005”、“COMP006”、“COMP007”、“COMP008”]

我建议使用,因为它是字符串格式的内置模块。我想使用它,但我的原始问题中缺少了一个大小写。我可以将
0
显示为
(两个空格),而不是
“00”吗
?谢谢。但是在
printf
中这样做没有什么聪明的地方,对吗?这是一种有趣的技术,但我认为在这种情况下没有多大价值。另一方面,如果你想填充每个字符串的结尾,那么使用类似的技术和惰性自然数可能会增加潜在的有用惰性。
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"]