Python "zfill ()" эквивалент в OCaml - PullRequest
0 голосов
/ 05 октября 2018

Я новичок, и я должен изучать Ocaml для научного программирования.У меня только один вопрос: есть ли в Ocaml эквивалент метода .zfill() Python для отображения начальных нулей в строке?

Ответы [ 2 ]

0 голосов
/ 05 октября 2018

Строки в 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
0 голосов
/ 05 октября 2018

Я не думаю, что есть один.

  • Вы можете легко сделать это с помощью встроенных функций, когда вы работаете с числами.Например, чтобы напечатать число 142857 с ведущими 0 более 30 символов, используйте Printf.printf "%030d" 142857.
  • . Вы также можете заставить его работать со строками, если вы хорошо используете начальные пробелы вместо начальных нулей.Например, Printf.printf "%30s" "abcdefg".
  • Наконец, если нужно, вы можете определить свою собственную функцию, если это необходимо.

Способ работы первых двух опций - Printf, что тоже чрезвычайно полезно, вам действительно нужно научиться в какой-то момент. Здесь - это документация для OCaml, но многие языки программирования имеют похожий инструмент.

В %030d мы начали с %d, который является заполнителем, который будет заменен нацелое число (в нашем случае 142857).Мы установили минимальную ширину 30 (по умолчанию выровнена по правому краю), добавив 30 между двумя символами: %30d.Наконец, мы добавили опцию, чтобы сделать начальные символы нулями вместо пробелов, добавив 0 после знака процента.

%30s - это просто заполнитель для выровненной по правому краю строки не менее 30 символов (сначальные пробелы, потому что опции для начальных нулей работают только с числами).


Теперь вот функция zfill, если по какой-то причине вы не можете использовать хорошо выбранный формат Printf в вашем сценарии:

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выполняется "на месте", конкатенация строк - нет, поэтому необходимо создать временную строку нулей.В большинстве случаев это не должно иметь большого значения, и вы можете использовать любой из этих вариантов.

...