如何将Ruby字符串强制为n个字符

Pau*_*aul 42 ruby string variables string-length

如何使用putsn个字符强制使用Ruby字符串变量输出,这样如果变量更长,它将被截断,如果更短,它将通过尾随或前导空格扩展?

有没有一些标准的方法来做到这一点?

the*_*Man 54

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"

如果要在右侧填充,请-在格式字符串中使用a :

[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   | Argument is a string to be substituted.  If the format
      | sequence contains a precision, at most that many characters
      | will be copied.

和:

-        | all           | Left-justify the result of this conversion.

如果我想填充空格而不是其他字符怎么办?

底层的Ruby代码是用C语言编写的,它的硬编码' '用作pad字符,因此不可能直接使用,除非你想修改源代码,重新编译你的Ruby,并使用该语言的一次性版本. .相反,你可以这样做:

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

这比简单的要复杂得多gsub.如果需要提供特殊字符,通常最好不使用格式字符串来调整字符串.格式字符串非常强大,但它们并不完全灵活.

否则,我会选择像@ steenslag这样的解决方案,这是推销自己的解决方案.你失去了使用格式字符串的能力,并且必须依靠连接你的字符串或类似的东西来获得柱状输出,但它也会起作用.


小智 37

使字符串固定长度更短:

  str_var.slice(1..10)
Run Code Online (Sandbox Code Playgroud)

要使字符串固定长度更长:

  str_var.ljust(10, ' ')
Run Code Online (Sandbox Code Playgroud)

它们可以合并为:

  (str_var.length > 10) ? str_var.slice(1..10) : str_var.ljust(10, ' ')
Run Code Online (Sandbox Code Playgroud)

str_var当然,你的字符串在哪里

  • 但是切片需要从零开始不是吗?`str_var.slice(0..10)` (2认同)

ste*_*lag 8

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"
Run Code Online (Sandbox Code Playgroud)

slice方法([])与rjust.


sup*_*ary 6

对于纯 Ruby one liner,您可以这样做:

(str + ' ' * length)[0,length]
Run Code Online (Sandbox Code Playgroud)

这将产生:

str = "Hello"
length = 10
=> "Hello     "
Run Code Online (Sandbox Code Playgroud)

或者:

str = "Hello"
length = 2
=> "He"
Run Code Online (Sandbox Code Playgroud)