我正在寻找一种习惯用语(可能是内置的)方式来在左侧使用零填充整数的字符串表示。
在我的情况下,整数永远不会超过99,因此
fix r = if length r == 1 then '0':r else r
fix.show <$> [1..15]
代码可以工作,但我认为有更好的方法。
在Haskell中,如何填充整数的字符串表示形式?
我正在寻找一种习惯用语(可能是内置的)方式来在左侧使用零填充整数的字符串表示。
在我的情况下,整数永远不会超过99,因此
fix r = if length r == 1 then '0':r else r
fix.show <$> [1..15]
代码可以工作,但我认为有更好的方法。
在Haskell中,如何填充整数的字符串表示形式?
Text.Printf
模块可用于实现类似 printf
的格式化输出:
import Text.Printf
fmt x = printf "%02d" x
或者特殊处理0的格式:
fmt 0 = " "
fmt x = printf "%02d" x
" "
(两个空格),而不是"00"
吗? - oromeprintf
中没有什么聪明的方法可以做到这一点,对吗? - orome> (\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
在负参数下返回空字符串的特性。
为了完整起见,我在此添加一个程序填充任何字符串列表,并使用传递的字符作为参数。
与其一开始就取长度的最大值,我使用循环编程的实例:如果你仔细看,你会发现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"]
Text.Printf
这个内置模块来进行字符串格式化。 - bheklilr