【问题标题】:Formatting string output in groovy在groovy中格式化字符串输出
【发布时间】:2013-08-12 17:29:10
【问题描述】:

我正在尝试在 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(或其他格式)输出的 lib 的任务吗?
  • 这将是基本的文本输出,文件将每天通过电子邮件发送给某些人。我们希望保持简单,没有 pdf 只是文本。
  • 如果每行只有一项,可以使用centerpadLeftpadRight方法。您可以编写一些代码将这三个函数的结果连接到一行中。
  • 是的,我希望避免这样做,但我可能不得不这样做。

标签: string groovy format


【解决方案1】:

一个快速而肮脏的解决方案可能是做这样的事情:

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 不足以容纳所有字段的情况,可能还有其他一些情况,但这可能是一个好的开始?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多