2012-07-16 35 views
5

正如你在红宝石知道,你可以做怎么办数字符串后缀

"%03d" % 5 
#=> "005" 

"%03d" % 55 
#=> "055" 

"%03d" % 555 
#=> "555" 

所以基本上号将有3米的地方

只是想知道,“0”字头是有可能做数字符串后缀以类似的好方式?

something 5 
#=> 500 

something 55 
#=> 550 

something 555 
# => 555 

回答

7

ljust方法怎么样?

"5".ljust(3, "0") 

和一些to_sto_i方法调用,如果你想这样做,以整数

你能避免串转换有一点数学像log_10找到一个整数的位数,然后i *= 10**x其中x是你要多0的需要

这样的:

def something(int, power=3) 
    int * 10**([power - Math.log10(int).to_i - 1, 0].max) 
end 
+0

真的很好,所以你对速度的建议是LOG10解决方案?似乎对我来说比ljust解决方案重一点 – equivalent8 2012-07-16 11:15:00

+0

我做了速度测试,“ljust”解决方案是最快的解决方案https://gist.github.com/3122349(也更清洁:)) – equivalent8 2012-07-16 12:10:48

+0

好吧,你的测试不完全公平int版本,因为你不测试整数<->字符串转换。看看这个:https://gist.github.com/3122511 - 赞成log10的显着差异。 +不得不提及[] .max是每次迭代创建新数组对象时的瓶颈。最大方法可以内联,更好的性能明显:) – keymone 2012-07-16 13:02:35

0

如何

def prettify(n) 
    ("%03d" % (n.to_s.reverse.to_i)).to_s.reverse 
    end 

  • 你的电话号码转换为字符串
  • 逆转它
  • 将其转换回数字
  • 格式,它
  • 转换回一个int
  • 再次反转

维护这段代码有可能成为一个挑战,从现在几个月了,当然:-)

+0

这是一个解决方案,但更像是,“ljust”由ruby直接提供http://ruby-doc.org/core-1.9.3/String.html#method-i-ljust – equivalent8 2012-07-16 12:09:31