字符串格式(左右填充),每行包含多个动态长度字符串

时间:2012-01-05 10:53:57

标签: java string formatting format

我正在编写一个程序,并且遇到了以下要求:

输出转到固定格式文件

     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 个答案:

答案 0 :(得分:1)

我会使用StringBuilder并通过跟踪计数器中的行长来自行填充。

这不是最快或最简洁的方法,但确实提供了更好的可读性和透明度。如果代码路径很热,JIT可能会优化这种指令。

答案 1 :(得分:1)

试试这个:

   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

答案 2 :(得分:0)

可以使用字符串格式方法轻松完成:

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

这将准确输出我想要的输出。