Как увеличить число в строке, сохраняя соответствующие конечные / ведущие нули - PullRequest
1 голос
/ 19 апреля 2020

Мне любопытно, как бухгалтерские программы позволяют увеличивать «номер счета» ie от увеличения INV-001 до INV-002. Давайте разберемся, сосредоточив внимание только на «001».

Я сделал «поиск в Google» и нашел использование "%03d":

puts "%03d" % 1
#=> "001"

Это начало, но я борюсь с много вариантов:

str = "001"
str = "009"

В школе нас учили:

# Let's assume we knew nothing about strings
001 + 1 # gives us 002. How?

# This is what really happens
#
#  001
# +  1
# ______
#  002

Используя вышеизложенное, если мы «добавим» 009 + 1, мы получим 010, если мы используем выше метод.

С программированием все по-другому, так как преобразование "001" в целое число становится 1.

Как создать метод, который знает, как добавить "001" плюс 1, который возвращает "002"?

Я предполагаю, что с формулой выше происходит много вещей:

  1. Как узнать, что добавить 1 к.
  2. Как он знает, чтобы перенести «остаток» влево, затем добавить ie 009 + 1 = 010
  3. Для 3, как он знает, чтобы держать ноль в конце 010, а не 10

Я пробовал много вещей, но все они неверны. Обычно мне нужно увеличивать строки:

# Result should be when str is incremented by 1
str = "002" + 1 #=> "003"
str = "0002" + 1 #=> "0003"
str = "009" + 1 #=> "010"
str = "0002" + 1 #=> "0010"
str = "02" + 1 #=> "03"
str = "1" + 1 #=> "2"

Преобразование str в плавающее теряет нули, и я не могу успешно использовать любые логики c с "%03d".

Ответы [ 2 ]

4 голосов
/ 19 апреля 2020

Мне интересно, как бухгалтерские программы позволяют увеличивать "номер счета" ie от увеличения INV-001 до INV-002.

Бухгалтерское программное обеспечение обычно не работает на ранее сгенерированной строке. Вместо этого он просто сохраняет номер счета (то есть цифру c часть) как обычное целое число, например:

invoice_number = 9

Затем форматирует это число в соответствии с небольшим шаблоном, например

format('INV-%03d', invoice_number)
#=> "INV-009"

Теперь, чтобы перейти от INV-009 к INV-010, нужно просто увеличить целое число и запустить его через форматтер:

invoice_number += 1
#=> 10

format('INV-%03d', invoice_number)
#=> "INV-010"
3 голосов
/ 19 апреля 2020

Вы можете использовать next примерно так:

("%03d" % 1).next #=> '002'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...