強制的にRuby puts
を使用して文字列変数をn文字に出力し、変数が長い場合は切り捨てられ、短い場合は末尾または先頭によって展開されるようにする方法スペース?
これを行うための標準的な方法はありますか?
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のソリューションのようなものを使用します。これは、独自のローリングの基礎となります。書式文字列を使用する機能を失い、文字列またはそれに似たものを連結して円柱状の出力を得る必要がありますが、これも機能します。
文字列を固定長にするには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
は、もちろん、あなたの文字列です
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
を組み合わせます。
純粋なRuby 1つのライナーの場合、これを行うことができます。
(str + ' ' * length)[0,length]
どちらが得られますか:
str = "Hello"
length = 10
=> "Hello "
または:
str = "Hello"
length = 2
=> "He"
文字列を切り捨てる方法について話している場合は、チェックアウトします ActionView :: Helpers :: TextHelper#truncate
例から:
truncate("Once upon a time in a world far far away")
# => Once upon a time in a world...