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

14

我正在寻找一种习惯用语(可能是内置的)方式来在左侧使用零填充整数的字符串表示。

在我的情况下,整数永远不会超过99,因此

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

代码可以工作,但我认为有更好的方法。

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


4
我建议使用 Text.Printf 这个内置模块来进行字符串格式化。 - bheklilr
4个回答

23

Text.Printf 模块可用于实现类似 printf 的格式化输出:

import Text.Printf

fmt x = printf "%02d" x

或者特殊处理0的格式:

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

我想使用这个,但是在我的原始问题中缺少一个情况。我能让它显示为" "(两个空格),而不是"00"吗? - orome
谢谢。但是在printf中没有什么聪明的方法可以做到这一点,对吗? - orome

12
> (\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在负参数下返回空字符串的特性。


3

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

与其一开始就取长度的最大值,我使用循环编程的实例:如果你仔细看,你会发现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

这是一个有趣的技巧,但我不认为在这种情况下它有太大的价值。另一方面,如果您想要填充每个字符串的结尾,那么使用类似的惰性自然数技术可能会添加潜在的有用惰性。 - dfeuer

2
怎么样?
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"]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接