Ruby on rails 如何在保持适当的尾随/前导零的同时增加字符串中的数字

Ruby on rails 如何在保持适当的尾随/前导零的同时增加字符串中的数字,ruby-on-rails,ruby,Ruby On Rails,Ruby,我很好奇会计软件如何使“发票号”从INV-001增加到INV-002。让我们只关注“001”进行剖析 我做了一些“谷歌搜索”,发现了“%03d”的用法: 将“%03d”放入“%1” #=> "001" 这只是一个开始,但我遇到了很多变化: str=“001” str=“009” 在学校里,我们被教导: #假设我们对字符串一无所知 001+1等于002。怎么用? #这就是真正发生的事情 # # 001 # + 1 # ______ # 002 使用上述方法,如果我们“添加”009+1,

我很好奇会计软件如何使“发票号”从INV-001增加到INV-002。让我们只关注“001”进行剖析

我做了一些“谷歌搜索”,发现了
“%03d”
的用法:

将“%03d”放入“%1”
#=> "001"
这只是一个开始,但我遇到了很多变化:

str=“001”
str=“009”
在学校里,我们被教导:

#假设我们对字符串一无所知
001+1等于002。怎么用?
#这就是真正发生的事情
#
#  001
# +  1
# ______
#  002
使用上述方法,如果我们“添加”009+1,如果我们使用上述方法,我们将得到
010

编程时情况大不相同,因为将“001”转换为整数变成了
1

如何创建知道如何添加
“001”
和返回
“002”
1
的方法

我假设上述公式会产生很多问题:

  • 它如何知道要添加什么
    1
  • 它如何知道将“余数”移到左边,然后添加ie
    009+1=010
  • 对于3,它如何知道在
    010
    末尾保持零,而不是
    10
  • 我试过很多东西,但都不正确。基本上我需要增加字符串:

    #结果应为str递增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”
    的任何逻辑。您可以像这样使用
    next

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

    您可以像这样使用
    next

    ("%03d" % 1).next #=> '002'
    
    我很好奇会计软件如何使“发票号”从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"
    
    我很好奇会计软件如何使“发票号”从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"
    

    谢谢,但问题是,来自用户的字符串是“002”,我需要增加该值,以便变量可以是最多10个字符的许多ie“0001”中的一个。@sylar为了完整起见,第四个示例更复杂,您必须实际转换为整数并返回,我不确定您如何使用它:
    input=“0002”;“%0#{input.length}d”%input.to_i(3)。next.to_s(3)#=>“0010”
    谢谢,但问题是,字符串来自用户“002”,我需要增加该值,以便在最多10个字符时,变量可以是许多ie“0001”中的一个。@sylar为了完整起见,第四个示例更复杂,您必须实际转换为整数并返回,我不知道你怎么知道如何使用它:
    input=“0002”;“%0#{input.length}d”%input.to_i(3)。next.to_s(3)#=>“0010”
    你太容易了!谢谢你的解释。现在我可以使用常规的增量列了。@Sylar“你让这太容易了!”–我想这是一种恭维:-)@Sylar:这是软件工程中的一个一般原则:正确的数据建模(在OO中也是正确的对象建模)使问题更容易解决。在这种情况下,对发票编号进行建模的正确方法是将其作为编号,而不是文本。(事实上,“发票号”这个名字已经泄露了。)一旦你把它建模成一个数字,做“数字的东西”,比如递增,就变得微不足道了。但这会变得很棘手。当“002”和“0002”不同时,如何将“002”存储为数字?发票编号在dB和
    “002”中是唯一的。to i
    “0002”。to i
    给出了相同的
    2
    @Sylar:那么它不是一个编号,而是一个“发票标识符对象”,而您将其建模为
    发票标识符
    。这太简单了!谢谢你的解释。现在我可以使用常规的增量列了。@Sylar“你让这太容易了!”–我想这是一种恭维:-)@Sylar:这是软件工程中的一个一般原则:正确的数据建模(在OO中也是正确的对象建模)使问题更容易解决。在这种情况下,对发票编号进行建模的正确方法是将其作为编号,而不是文本。(事实上,“发票号”这个名字已经泄露了。)一旦你把它建模成一个数字,做“数字的东西”,比如递增,就变得微不足道了。但这会变得很棘手。当“002”和“0002”不同时,如何将“002”存储为数字?发票编号在dB和
    “002”中是唯一的。to i
    “0002”。to i
    给出了相同的
    2
    @Sylar:那么它不是一个编号,而是一个“发票标识符对象”,您可以将其建模为
    发票标识符。