我是一个初学者,必须学习Ocaml才能进行科学编程。我只有一个问题:
在Ocaml中是否有与Python的.zfill()
方法等效的方法,以使前导零出现在字符串中?
答案 0 :(得分:0)
我认为没有。
Printf.printf "%030d" 142857
。Printf.printf "%30s" "abcdefg"
。前两个选项的工作方式是使用Printf
,这也是非常有用的,您确实应该在某个时候学习。 Here是OCaml的文档,但是许多编程语言都有类似的工具。
在%030d
中,我们从%d
开始,它是一个占位符,将被一个整数代替(在我们的例子中为142857)。通过在两个字符之间添加30:%30d
,将其最小宽度固定为30(默认情况下为右对齐)。最后,我们在百分号后添加0,从而使前导字符为零而不是空格。
%30s
只是一个至少30个字符的右对齐字符串的占位符(带前导空格,因为前导零的选项仅适用于数字)。
现在,如果由于某种原因您不能在场景中使用精心选择的Printf格式,则可以使用zfill函数:
let zfill n s =
let length = Bytes.length s in
if n <= length then
s
else
let result = Bytes.make n '0' in
Bytes.blit s 0 result (n-length) length;
result
;;
请注意,如果性能是一个问题(尽管可能不是问题),那么它的执行速度应比创建零字符串然后将其与s
串联的解决方案要快,而blit
是“就地”完成的,不是字符串串联,因此必须创建一个临时零字符串。在大多数情况下,这无关紧要,您可以使用任一选项。
答案 1 :(得分:0)
OCaml中的字符串是不可变的。这意味着您不应该修改字符串,而要创建一个新字符串。
标准库中没有zfill函数,但是您可以轻松地做到这一点:
let zfill s width =
let to_fill = width - (String.length s) in
if to_fill <= 0 then s
else (String.make to_fill '0') ^ s