форматирование строк (правое и левое заполнение) с несколькими строками динамической длины в каждой строке - PullRequest
1 голос
/ 05 января 2012

Я пишу программу и застрял в следующем требовании:

Вывод идет в файл фиксированного формата

     Total 1                   Total 2
 ----------------          ----------------
       311,862.33                 23,456.00
        40,000.00                789,123.00  

Как в приведенном выше примере, длина строки суммыменяется.

Требуется, чтобы сумма всегда начиналась в конце «дефисов».

Как этого добиться?

Я знаю, что правый и левый пады к строкеможно получить через:

String.format("%1$#20s", "311,862.33");
String.format("%1$-15s", "12345");

Но как добиться в моем случае, когда в каждой строке несколько строк, а длины строк являются динамическими?

Ниже приведен код, который форматирует количество водин столбец.Но как добиться того же для нескольких столбцов, то есть для нескольких сумм в одной строке?

String format = "%10.2f\n"; // width == 10 and 2 digits after the dot
float [] floats = {123.45f, 99.0f, 23.2f, 45.0f};
for(int i=0; i<floats.length; i++) {
    float value = floats[i];
    System.out.format(format, value);
}

Это даст вывод как:

123.45
 99.00
 23.20
 45.00

Спасибо за чтение!

Ответы [ 3 ]

1 голос
/ 05 января 2012

Попробуйте это:

   try {
       String formatCol1 = "%10.2f"; // width == 10 and 2 digits after the dot
       String formatCol2 = "%15.2f"; // adjust width to control space between columns

       float[] floats1 = {123.45f, 99.0f, 23.2f, 45.0f};
       float[] floats2 = {12345.67f, 999.90f, 2345.32f, 12.0f};
       for (int i=0; i<floats1.length; i++) {
           float value1 = floats1[i];
           float value2 = floats2[i];

           ByteArrayOutputStream baos = new ByteArrayOutputStream();
           PrintStream printStream = new PrintStream(baos);
           printStream.format(formatCol1, value1);
           printStream.format(formatCol2, value2);

           System.out.println(baos.toString("utf8"));
        }
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }

Вывод:

123.45       12345.67
 99.00         999.90
 23.20        2345.32
 45.00          12.00
1 голос
/ 05 января 2012

Я бы использовал StringBuilder и сам вставлял заполнение, отслеживая длину строки в счетчике.

Это не самый быстрый и лаконичный метод, но он обеспечивает лучшую читаемость и прозрачность.JIT, вероятно, оптимизирует такого рода инструкции, если путь к коду горячий.

0 голосов
/ 05 января 2012

Это легко сделать, используя метод строкового формата:

String amount1 = "311,862.33";
String amount2 = "45,678.22";
String content = String.format("%26s", amount1) + String.format("%20s", amount2);

Это даст вывод именно так, как я хочу.

...