将输出格式化为每行40个字符

我对Ruby相当陌生,现在我一直在Google上搜索几个小时。 有谁知道如何格式化打印输出不超过40个字符长?

例如:

我想要打印的内容:

This is a simple sentence.
This simple
sentence appears
on four lines. 

但我希望它的格式如下:

This is a simple sentence. This simple
sentence appears on four lines.

我把原来的每一行放入数组中。
所以x = ["This is a simple sentence.", "This simple", "sentence appears", "on three lines."]
我试过x.each { |n| print n[0..40], " " } x.each { |n| print n[0..40], " " }但它似乎没有做任何事情。

任何帮助将是太棒了!


该方法word_wrap需要一个Strind和让人有种漂亮的印刷。

你的数组被转换为一个带有join("n")的字符串join("n")

代码:

def word_wrap(text, line_width = 40 ) 
  return text if line_width <= 0
  text.gsub(/n/, ' ').gsub(/(.{1,#{line_width}})(s+|$)/, "1n").strip
end

x = ["This is a simple sentence.", "This simple", "sentence appears", "on three lines."]

puts word_wrap(x.join("n"))
x << 'a' * 50 #To show what happens with long words
x << 'end'
puts word_wrap(x.join("n"))

代码说明:

x.join("n"))构建一个字符串,然后用text.gsub(/n/, ' ')构建一个长行。 在这种特殊情况下,这两个步骤可以合并: x.join(" "))

现在魔术发生了

gsub(/(.{1,#{line_width}})(s+|$)/, "1n")
  • (.{1,#{line_width}}) ):将任何字符line_widthline_width字符。
  • (s+|$) :下一个字符必须是空格或行结尾(换句话说:如果最后一个字符没有空格,则前一个匹配可能会缩短line_width
  • "1n" :取最多40个字符长的字符串并用换行符结束。
  • gsub重复包装直到完成。
  • 最后,我用strip删除了前导和尾随空格

    我还加了一个长词(50个)。 怎么了? gsub不匹配,这个词保持原样。


    puts x.join(" ").scan(/(.{1,40})(?:s|$)/m)
    

    这是一个简单的句子。 这很简单
    句子出现在三行上。


    Ruby 1.9(而不是过于高效):

    >> x.join(" ").each_char.each_slice(40).to_a.map(&:join)
    => ["This is a simple sentence. This simple s", "entence appears on three lines."]
    

    解决方案不起作用的原因是所有单个字符串都少于40个字符,因此n[0..40]始终是整个字符串。

    链接地址: http://www.djcxy.com/p/62529.html

    上一篇: Format output to 40 characters long per line

    下一篇: Formatting a number with leading zeros in PHP