我正在尝试打印出Groovy中的基本标题。我需要第一行将日期左对齐,以机构名称为中心,页码右对齐。在第二行中,我需要一个报告描述,该描述以右对齐的报告名称为中心。我无法获得将输出示例正确粘贴到此文本字段的示例,因此希望此描述已足够,这似乎很标准。
我从数据库中检索日期,机构名称,报告说明和报告名称。因此,这些字段的大小是可变的。我以为这样的事情会奏效,但不能正确地进行对齐或正确居中:
println String.format("%-${maxColumns}s %s %${maxColumns}s", dbDateTime.format('MMMMM d, yyyy'), institution, 'Page: 1')
println String.format("%-${maxColumns}s %s %${maxColumns}s", '', jobTitle, programName)
我将maxColumns设置为80个字符数限制。感谢您的任何帮助,我为此高高在上搜寻!谢谢!
最佳答案
一种快速而肮脏的解决方案可能是执行以下操作:
def header( int maxWidth=80, ...text ) {
def cols = maxWidth / text.size()
def idx = 0
text.inject( '' ) { s, t ->
idx++
if( t instanceof String ) {
s += t.center( (int)cols )
}
else {
switch( t.align ) {
case 'left' : s += t.text.padRight( cols, t.pad ?: ' ' ) ; break
case 'right' : s += t.text.padLeft( cols, t.pad ?: ' ' ) ; break
default : s += t.text.center( cols, t.pad ?: ' ' )
}
}
if( s.length() < Math.ceil( cols * idx ) && s.length() < maxWidth ) s += ' '
s
}
}
然后,您可以向其传递 map 列表,例如:
def text = header( [ text:dbDateTime.format( 'MMMMM d, yyyy' ), align:'left' ],
[ text:'woo', pad:'-' ],
[ text:'Page 1', align:'right' ] )
并将其打印出来将为您提供:
August 12, 2013 -----------woo------------ Page 1
显然,这不能解决
maxWidth
不足以容纳所有字段的情况,可能还不能解决其他一些情况,但这可能是一个好的开始吗?