如何增加字符串中的数字,同时保留适当的尾随/前导零

问题描述 投票:0回答:3

我很好奇会计软件如何实现“发票编号”递增,即从 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"
的方法?

我假设上面的公式发生了很多事情:

  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
转换为浮点会丢失零,我似乎无法成功地使用
"%03d"
来使用任何逻辑。

ruby-on-rails ruby
3个回答
4
投票

我很好奇会计软件如何实现“发票编号”递增,即从 INV-001 递增到 INV-002。

会计软件通常不会对之前生成的字符串进行操作。相反,它只是将发票号码(即数字部分)存储为普通整数,例如:

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
投票

您可以像这样使用

next

("%03d" % 1).next #=> '002'

0
投票

这可能是新问题,因为问题最初是提出的,但是

succ
/
next
是处理这个问题的最简单方法。

irb(main):048> 1.succ
=> 2
irb(main):049> "002".next
=> "003"
irb(main):050> "002".succ
=> "003"
irb(main):051> "0003".next
=> "0004"
irb(main):052> "009".succ
=> "010"
irb(main):003> "999".next
=> "1000"
© www.soinside.com 2019 - 2024. All rights reserved.