另外,我如何将其格式化为用零填充的字符串?
要生成数字调用rand,结果为"10到10的幂"
rand(10 ** 10)
要用零填充数字,可以使用字符串格式运算符
'%010d' % rand(10 ** 10)
或者rjust
字符串的方法
rand(10 ** 10).to_s.rjust(10,'0')
我想提供一个我认识的最简单的解决方案,这是一个非常好的技巧.
rand.to_s[2..11] => "5950281724"
这是生成10大小数字字符串的快速方法:
10.times.map{rand(10)}.join # => "3401487670"
最简单的答案可能是
rand(1e9...1e10).to_i
该to_i
部分是必要的,因为1e9
和1e10
实际上是浮动:
irb(main)> 1e9.class => Float
rand.to_s[2..11].to_i
为什么?因为这是你能得到的:
rand.to_s[2..9] #=> "04890612"
然后:
"04890612".to_i #=> 4890612
注意:
4890612.to_s.length #=> 7
这不是你所期望的!
要在您自己的代码中检查该错误,而不是.to_i
您可以像这样包装它:
Integer(rand.to_s[2..9])
很快就会发现:
ArgumentError: invalid value for Integer(): "02939053"
所以坚持下去总是更好.center
,但请记住:
rand(9)
有时可能会给你0
.
为了防止:
rand(1..9)
这将永远返回1..9
范围内的东西.
我很高兴我有很好的测试,我希望你能避免破坏你的系统.
仅仅因为没有提到,该Kernel#sprintf
方法(或它Kernel#format
在Powerpack库中的别名)通常比该String#%
方法更受欢迎,如Ruby社区风格指南中所述.
当然这是值得商榷的,但要提供见解:
@ quackingduck的答案的语法是
# considered bad '%010d' % rand(10**10) # considered good sprintf('%010d', rand(10**10))
这种偏好的本质主要是由于它的神秘性质%
.它本身并不是非常语义,没有任何额外的上下文,它可以与%
模运算符混淆.
样式指南中的示例:
# bad '%d %d' % [20, 10] # => '20 10' # good sprintf('%d %d', 20, 10) # => '20 10' # good sprintf('%{first} %{second}', first: 20, second: 10) # => '20 10' format('%d %d', 20, 10) # => '20 10' # good format('%{first} %{second}', first: 20, second: 10) # => '20 10'
为了正义String#%
,我个人很喜欢使用运营商类似的语法,而不是命令,以同样的方式,你会做your_array << 'foo'
了your_array.push('123')
.
这恰恰说明了社区中的一种趋势,"最好的"取决于你.
此博客中的更多信息.
使用内核#rand方法:
rand(1_000_000_000..9_999_999_999) # => random 10-digits number
使用times
+ map
+ join
组合:
10.times.map { rand(0..9) }.join # => random 10-digit string (may start with 0!)
使用字符串#%方法:
"%010d" % 123348 # => "0000123348"
使用KeePass密码生成器库,它支持生成随机密码的不同模式:
KeePass::Password.generate("d{10}") # => random 10-digit string (may start with 0!)
可以在此处找到KeePass模式的文档.