さらに、ゼロで埋められた文字列としてフォーマットするにはどうすればよいですか?
23 に答える
式「10 の 10 乗」の結果を使用して数値呼び出し rand を生成するには
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
Ruby Community Style Guideに記載されているように、言及されていないという理由だけで、Kernel#sprintf
メソッド (またはPowerpack ライブラリKernel#format
のエイリアス) は一般的にメソッドよりも優先されます。String#%
もちろん、これには非常に議論の余地がありますが、洞察を提供するために:
@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')
。
これはコミュニティの傾向を示しているだけで、何が「ベスト」かはあなた次第です。
詳細については、このブログ投稿をご覧ください。
これは、quackingduck の例よりも 1 つ少ないメソッド呼び出しを使用する式です。
'%011d' % rand(1e10)
1 つの注意点は で1e10
あり、Float
最終的にそれKernel#rand
を呼び出すto_i
ことになるため、より高い値の場合、矛盾が生じる可能性があります。リテラルでより正確にするために、次のこともできます。
'%011d' % rand(10_000_000_000) # Note that underscores are ignored in integer literals
最初の回答を変更したいだけです。rand (10**10)
0 が 1 位の場合、9 桁のランダムな no が生成される場合があります。正確な10桁を確保するには、変更するだけです
code = rand(10**10)
while code.to_s.length != 10
code = rand(11**11)
終わり
n桁の乱数を生成する最も簡単な方法 -
Random.new.rand((10**(n - 1))..(10**n))
10 桁の数字を生成する number -
Random.new.rand((10**(10 - 1))..(10**10))
この手法は、あらゆる「アルファベット」で機能します。
(1..10).map{"0123456789".chars.to_a.sample}.join
=> "6383411680"
以下の簡単な方法を使用してください。
rand(10 ** 9...10 ** 10)
以下の IRB でテストするだけです。
(1..1000).each { puts rand(10 ** 9...10 ** 10) }
これは ruby 1.8.7 でも動作します:
rand(9999999999).to_s.center(10, rand(9).to_s).to_i