如何在Ruby中高效地将字符串转换为整数再转换为字符串?

3

我可能在探讨一个有效的SO问题方面走了一条纤细的线,但是...

在Ruby中,将字符串转换为整数、添加某些值,然后再转换回字符串,哪种方法最好?

(string.to_i+1).to_s 

感觉不对劲,很丑陋。

编辑:

在阅读下面的各种评论之后,我将保持原样,不会选择一个答案,因为你们大多数人都说我的解决方案是正确的。 我想Ruby已经让我认为总有一个更简单、更好的方法(我们寻找这样一个更简单的解决方案并不是坏事,是吗?)

我的示例导致了一些关于.next的提交,而我的实际用例不仅仅是增量,我正在将AM / PM时间字符串转换为24小时制,所以实际上我需要将像07:00 PM或7p或7 pM或任何类似的东西转换为19:00。

我已经做得很好了,只是在寻找更优雅的东西。 我知道SO是“如何”问题,而stack review是代码审查,我在这里有点作弊……抱歉mods。


5
那为什么会被认为是错误和丑陋的呢?你能否举出其他语言中更加优美的解决方案的例子? - ndnenkov
这就是正确的做法。假设字符串是“123cat”或“-123”,你想要加上3。你能想到比你提出的更好的方法来得到“126”或“-120”吗? - Cary Swoveland
3个回答

10
如果你想要像你的示例(递增)一样操作,你可以使用 next 方法:
=> "1".next
=> "2"

4
"-3".next #=> "-4" 意思是将字符串"-3"加1,得到结果为"-4"。"123cat".next #=> "123cau" 意思是将字符串"123cat"加1,得到结果为"123cau"。 - Cary Swoveland
@CarySwoveland 是的,继承者通过递增字符串中从最右侧的字母数字(或如果没有字母数字则为最右侧字符)开始的字符来计算。 - Roman Kiselenko
这种方法有什么实际的实用价值?我猜它不仅仅用于递增数字。 - Wand Maker
1
不仅仅是数字,字母也可以,>> "a".next => "b",非常有用,我在自己的动态模板引擎中使用它。 - Roman Kiselenko
是的,String#next 在各种应用程序中都很方便。但是在这里不应该使用它。这里有另一个问题。如果字符串是 str 并且您想添加 n = 1_000_000_000,则需要 n.times { str.next! } - Cary Swoveland

2
String(Integer(string) + n)

#to_s#to_i可能过于宽松。使用StringInteger函数可以避免意外的错误。

示例:

"$10".to_i 
#=> 0 
Integer("$10") 
#=> ArgumentError: invalid value for Integer(): "$10"
"10.5".to_i 
#=> 10 
Integer("10.5") 
#=> ArgumentError: invalid value for Integer(): "10.5"

如果Integer()函数的值无效,它会引发一个错误。例如:Integer("b") => ArgumentError: invalid value for Integer(): "b" - Roman Kiselenko

0

你也可以 :)

eval("#{string} + #{number}").to_s
(Integer(string) + number).to_s
"#{string.to_i + number}"
"#{Integer(string) + number}"
etc...

无论如何,第一个答案更优雅。


1
建议不要使用 eval,因为它可能导致严重的错误。 - Roman Kiselenko
to_i 的一个重要用途是处理以数字(可能带有减号)开头,后跟非数字的字符串。在这种情况下,Integer(string) 当然会引发异常。作为一般性建议,我建议您避免在答案中使用 "etc.""..." 等等(但在像这样的评论中可以)。我确实同意第一个答案更加优雅(尽管不正确)。 - Cary Swoveland

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