如何在 Ruby 中增加一个字符串数字

5
我如何在Ruby中自信地递增字符串数字? 我知道我可以调用"1".next来得到"2", 但这对负数不起作用。
"-3".next
=> "-4"

我该如何调用以增加正数和负数的字符串数字?我想要将其作为字符串返回。


2
你可以通过一个数字进行往返:x.to_i.next.to_s - Sergio Tulentsev
1
它不被解释为负数,更像是“章节-3”。 - Stefan
4
真正正确的做法是找出为什么一开始会有“字符型数字”而不是数字,并解决这个问题,而不是试图绕过它。 - Jörg W Mittag
@Jörg,我认为真正正确的方法是退一步并避免增加与其他文本混合的数字的字符串表示。也许我们在说同样的事情:改变设计。 - Cary Swoveland
3个回答

5
你可以将该字符串转换为整数,调用 #next 然后再将其转换回字符串。
'-3'.to_i.next.to_s

1
你可以直接执行 ("-3".to_i + 1).to_s,但这不考虑浮点数(如果你需要的话)。你可以使用带有块并匹配正则表达式的gsub方法来转换和递增。对于负数,next无法工作,因为它只计算最右边的数字,不关心减号字符。以下代码匹配整数或浮点数,并根据整数类型递增它们:
INCREMENTAL = 1

def increment_str(str)
  str.gsub(/(-)?\d+(.\d+)?/) { |x| x.include?(".") ? x.to_f + INCREMENTAL : x.to_i + INCREMENTAL }
end

increment_str("-3") => "-2"
increment_str("3") => "4"
increment_str("-3.0") => "-2.0"
increment_str("3.0") => "4.0"

1
你的答案取决于输入是整数还是浮点数。 在每种情况下,将其转换为适当的数字类型(to_ito_f),增加1,并转换回字符串。例如:
['-1.23', '-1', '0', '1', '1.23'].each do |str|
  int_str_plus_1 = (str.to_i + 1).to_s
  float_str_plus_1 = (str.to_f + 1).to_s
  puts [str, int_str_plus_1, float_str_plus_1].join("\t")
end

输出:

-1.23  0  -0.22999999999999998
-1     0  0.0
0      1  1.0
1      2  2.0
1.23   2  2.23

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接