Ruby on rails 如何在保持适当的尾随/前导零的同时增加字符串中的数字
我很好奇会计软件如何使“发票号”从INV-001增加到INV-002。让我们只关注“001”进行剖析 我做了一些“谷歌搜索”,发现了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,
“%03d”
的用法:
将“%03d”放入“%1”
#=> "001"
这只是一个开始,但我遇到了很多变化:
str=“001”
str=“009”
在学校里,我们被教导:
#假设我们对字符串一无所知
001+1等于002。怎么用?
#这就是真正发生的事情
#
# 001
# + 1
# ______
# 002
使用上述方法,如果我们“添加”009+1,如果我们使用上述方法,我们将得到010
编程时情况大不相同,因为将“001”转换为整数变成了1
如何创建知道如何添加“001”
和返回“002”
的1
的方法
我假设上述公式会产生很多问题:
1
009+1=010
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:那么它不是一个编号,而是一个“发票标识符对象”,您可以将其建模为发票标识符。