2013-08-09 2 views
3

Я пытаюсь распечатать основной заголовок в Groovy. Мне нужно, чтобы первая строка имела оправданную дату, с именем центра, расположенным по центру, и номером страницы, оправданным. Во второй строке мне нужно, чтобы описание отчета было сконцентрировано с названием отчета правильно обоснованным. Я не смог получить пример вывода для правильного ввода в это текстовое поле, поэтому, надеюсь, этого описания будет достаточно, он выглядит довольно стандартным.Форматирование вывода строки в 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, ограничение на количество символов. Любая помощь приветствуется, я искал высоко и низко для этого! Благодаря!

+0

Для чего вы собираетесь это использовать? Вы уверены, что это не задача для чего-то вроде яшмы или какой-нибудь библиотеки с выходом в формате pdf (или других форматов)? – Will

+0

Это будет основной вывод текста, и файл будет ежедневно отправляться по электронной почте определенным лицам. Мы хотим сохранить этот простой, без pdf-текста просто текст. – tnichol

+1

Если это был только один элемент в строке, вы можете использовать методы [center] (http://groovy.codehaus.org/groovy-jdk/java/lang/String.html#center (java.lang.Number)) , [padLeft] (http: //groovy.codehaus. орг/заводной-JDK/Java/языки/String.html # padRight (java.lang.Number)). Вы можете написать код, чтобы объединить результаты этих трех функций в одну строку. – jesseplymale

ответ

2

быстрый и грязный раствор может быть, чтобы сделать что-то вроде этого:

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 не является достаточно большим, чтобы держать al l полей и, возможно, нескольких других случаев, но это может быть хорошим началом?

+0

разработал ящик для меня! +1 для этого великолепного решения !!! – rahulserver

Смежные вопросы