適切な末尾/先頭のゼロを維持しながら文字列内の数値をインクリメントする方法

概要

会計ソフトウェアがどのようにして「請求書番号」の増加、つまり INV-001 の増加から INV-002 への増加を可能にするのかに興味があります。 「001」だけに焦点を当てて解剖してみましょう。

「グーグル」を行ったところ、「%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」を返すメソッドを作成するにはどうすればよいですか?

上記の式では多くのことが起こっていると思います。

たくさんのことを試しましたが、すべて間違っています。基本的に文字列をインクリメントする必要があります。

# 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 を float に変換するとゼロが失われ、「%03d」ではどのロジックも正常に使用できないようです。

解決策

通常、会計ソフトウェアは、以前に生成された文字列では動作しません。代わりに、請求書番号 (数値部分) を通常の整数として保存します。例:

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"