OCaml中的Python“ zfill()”等效项

时间:2018-10-04 21:56:14

标签: python string ocaml leading-zero

我是一个初学者,必须学习Ocaml才能进行科学编程。我只有一个问题: 在Ocaml中是否有与Python的.zfill()方法等效的方法,以使前导零出现在字符串中?

2 个答案:

答案 0 :(得分:0)

我认为没有。

  • 在处理数字时,可以使用内置函数轻松完成此操作。例如,要打印前导0超过30个字符的数字142857,请使用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