String 在groovy中格式化字符串输出

String 在groovy中格式化字符串输出,string,groovy,format,String,Groovy,Format,我正在尝试用Groovy打印一个基本的头文件。我需要第一行将日期左对齐,以机构名称为中心,页码右对齐。在第二行,我需要一个以右对齐的报告名称为中心的报告描述。我无法将输出的示例正确粘贴到此文本字段,所以希望此描述足够了,它看起来相当标准 我从数据库中检索日期、机构名称、报告描述和报告名称。所以这些字段的大小是可变的。我原以为这样做会奏效,但它不能正确地证明或居中: println String.format("%-${maxColumns}s %s %${maxColumns}s", dbDat

我正在尝试用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
    }
}
打印此文件将为您提供:

August 12, 2013            -----------woo------------                     Page 1

显然,这无法处理
maxWidth
不够大,无法容纳所有字段的情况,可能还有一些其他情况,但这可能是一个好的开始?

您打算用它做什么?您确定这不是jasper或某些具有pdf(或其他格式)输出的lib的任务吗?它将是基本文本输出,并且文件将每天通过电子邮件发送给某些个人。我们希望保持这个简单,没有PDF,只有文本。如果每行只有一个项目,您可以使用方法,和。你可以编写一些代码将这三个函数的结果连接成一行。是的,我希望避免这样做,但我可能不得不这样做。
August 12, 2013            -----------woo------------                     Page 1