54

Ruby文字列変数の出力をputsn文字まで強制して、変数が長い場合は切り捨てられ、短い場合は末尾または先頭のスペースで展開されるようにするにはどうすればよいですか?

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

4

5 に答える 5

58

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

[11](こじ開け)メイン:0>'%3.3s'%'f'
=> "f"
[12](pry)main:0>'%3.3s'%'foo'
=>「foo」
[13](pry)main:0>'%3.3s'%'foobar'
=>「foo」

右側をパディングする場合-は、フォーマット文字列でaを使用します。

[14](こじ開け)メイン: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のソリューションのようなものを使用します。これは、独自のソリューションを作成するための基礎です。フォーマット文字列を使用する機能が失われ、文字列の連結など、列出力を取得するために依存する必要がありますが、これも機能します。

于 2013-02-05T19:10:12.137 に答える
51

文字列を固定長に短くするには:

  str_var.slice(0..10) # starts at the first letter

文字列を固定長に長くするには:

  str_var.ljust(10, ' ')

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

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

str_varもちろん、あなたの弦はどこにありますか

于 2013-02-05T19:24:41.960 に答える
10
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ます。

于 2013-02-05T19:37:09.820 に答える
6

純粋なRubyワンライナーの場合は、次のようにします。

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

どちらが得られます:

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

また:

str = "Hello"
length = 2
=> "He"
于 2016-01-07T11:24:24.557 に答える
1

文字列を切り捨てるメソッドについて話している場合は、ActionView :: Helpers :: TextHelper#truncateを確認します。

例から:

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

# => Once upon a time in a world...
于 2013-02-05T19:15:15.217 に答える