在Groovy中格式化字符串输出

3
我正在试图在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,即字符限制。非常感谢您的帮助,我已经到处搜索这个问题!谢谢!


你打算用这个做什么?你确定这不是像Jasper或一些带有PDF(或其他格式)输出的库那样的任务吗? - Will
这将是基本的文本输出,并且该文件将每天通过电子邮件发送给特定的个人。我们希望保持简单,不使用PDF格式,只使用文本。 - tnichol
1
如果每行只有一个项目,您可以使用方法centerpadLeftpadRight。您可以编写一些代码将这三个函数的结果连接成一行。 - jesseplymale
是的,我本来希望避免这样做,但我可能不得不这么做。 - tnichol
1个回答

3
一个快速且简单的解决方案可能是类似这样做:

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
    }
}

您可以向其传递类似以下的地图列表:
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不足以容纳所有字段的情况,还有可能存在其他一些情况,但这可能是一个不错的开始?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接