Ruby:如何使用sprintf()在数字字符串的前面添加零

Vic*_*orO 9 ruby string

我想将zipcodes标准化为5位数字,用零替换任何丢失的字符,如下所示:

"95616" >> "95616"
"854"  >> "00854"
"062" >> "00062"
"0016" >> "00016"
Run Code Online (Sandbox Code Playgroud)

我一直在使用的sprintf像这样尝试sprintf("%05s", zipcode)和像这样 sprintf("%0.5d", zipcode).两者都给出错误答案.使用s:

"95616" >> "95616"
"854"   >> "  854"
"062"   >> "  062"
"0016"  >> " 0016"
Run Code Online (Sandbox Code Playgroud)

这是正确的字符数,但使用空格而不是零.

使用d:

"95616" >> "95616"
"854"   >> "00854"
"062"   >> "00050"
"0016"  >> "00014"
Run Code Online (Sandbox Code Playgroud)

在这种情况下sprintf()的正确用法是什么?

ste*_*lag 25

不要用sprintf以下方式折磨自己:

puts "123".rjust(5, '0') # => 00123
Run Code Online (Sandbox Code Playgroud)

  • 我不喜欢这种方法的是,如果数字已经有前导零,它们就不会被截断,因为如果数字被转换为整数然后重新格式化它们就会被截断."000000123".rjust(5,'0')=>"000000123"`vs.'%05d'%'000000123'.to_i` =>"00123"`. (2认同)

mrl*_*lee 8

你对sprintf的使用很好.你的问题是062(和0016)是八进制(任何以0开头的整数),转换为base10时变为50.

解决方案是在它到达你的Ruby应用程序之前摆脱它.假设它是一个字符串(因为你的例子显示字符串),你可以这样做:

"062".gsub /^0/, ''
Run Code Online (Sandbox Code Playgroud)

然后继续填充和打印格式.

另一种方法是,如果你知道它以0开头,它会故意将其打印为八进制:

"%05o" % 062 # => "00062"
Run Code Online (Sandbox Code Playgroud)

当然,如果您可以控制输入,最好的办法是确保人们不会通过输入您不期望的数字来破坏您的代码.例如.

"%05s" % 0xff0055 # => 16711765
"%05x" % 0xff0055 # => "ff0055"
Run Code Online (Sandbox Code Playgroud)

检查输入会将问题从格式化问题更改为验证问题,并且最好是防止而不是处理问题.

(古怪的%语法是printf/的糖sprintf)


pgu*_*rio 6

你想要%05d.String#%作为快捷方式:

"%05d" % "123" #=> 00123
Run Code Online (Sandbox Code Playgroud)