web-dev-qa-db-ja.com

強制的にRuby文字列をn文字にする方法

強制的にRuby putsを使用して文字列変数をn文字に出力し、変数が長い場合は切り捨てられ、短い場合は末尾または先頭によって展開されるようにする方法スペース?

これを行うための標準的な方法はありますか?

39
Paul

Rubyは、他の多くの言語と同様に、フォーマット文字列の使用をサポートしています。

 [11](pry)main:0> '%3.3s'% 'f' 
 => "f" 
 [12](pry)main:0> ' %3.3s '%' foo '
 => "foo" 
 [13](pry)main:0>'%3.3s '%' foobar '
 => " foo "

右側を埋め込みたい場合は、フォーマット文字列で-を使用します。

 [14](pry)main:0> '%-3.3s'% 'f' 
 => "f" 
 [15](pry)main:0> '%-3.3s'% 'foo' 
 => "foo" 
 [16](pry)main:0> '%-3.3s'% 'foobar' 
 => "foo" 

printfまたはsprintfを使用することもできますが、より一般的な % を好みます。 sprintf

sprintfドキュメントから:

 s |引数は、置換される文字列です。形式
 |シーケンスには最大でその数の文字
 |コピーされます。

そして:

-|すべて|この変換の結果を左揃えにします。

スペースではなく、他の文字で埋めたい場合はどうすればよいですか?

基盤となるRubyコードはCで記述されており、' 'をパッド文字として使用するようにハードコーディングされているため、ソースを変更して再コンパイルしない限り、直接は不可能です。 Rubyを使用して、言語の1回限りのバージョンを使用します。代わりに、次のようなことができます。

 [17](pry)main:0>( '%-3.3s'% 'f')。gsub( ''、 '。')
 => "f .." 

ただし、これは単純なgsubよりもはるかに複雑になります。多くの場合、特殊文字を指定する必要がある場合は、フォーマット文字列を使用せずに文字列を調整する方が適切です。フォーマット文字列は非常に強力ですが、完全に柔軟ではありません。

それ以外の場合は、@ steenslagのソリューションのようなものを使用します。これは、独自のローリングの基礎となります。書式文字列を使用する機能を失い、文字列またはそれに似たものを連結して円柱状の出力を得る必要がありますが、これも機能します。

52
the Tin Man

文字列を固定長にするにはshorter

  str_var.slice(1..10)

文字列を固定長にするにはlonger

  str_var.ljust(10, ' ')

それらは次のようなものに組み合わせることができます。

  (str_var.length > 10) ? str_var.slice(1..10) : str_var.ljust(10, ' ')

どこ str_varは、もちろん、あなたの文字列です

34
MiGro
class String
  def fix(size, padstr=' ')
    self[0...size].rjust(size, padstr) #or ljust
  end
end

p 'lettersletters'.fix(9) #=> "lettersle"
p 'letters'.fix(10, '.')  #=> "...letters"

sliceメソッド([])とrjustを組み合わせます。

8
steenslag

純粋なRuby 1つのライナーの場合、これを行うことができます。

(str + ' ' * length)[0,length]

どちらが得られますか:

str = "Hello"
length = 10
=> "Hello     "

または:

str = "Hello"
length = 2
=> "He"
3
superluminary

文字列を切り捨てる方法について話している場合は、チェックアウトします ActionView :: Helpers :: TextHelper#truncate

例から:

truncate("Once upon a time in a world far far away")

# => Once upon a time in a world...
1
Kormie