【问题标题】:string formatting (right and left padding) with multiple dynamic length strings in each line字符串格式(左右填充),每行有多个动态长度字符串
【发布时间】:2012-01-05 10:53:57
【问题描述】:

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

输出到一个固定格式的文件

     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

感谢阅读!

【问题讨论】:

    标签: java string formatting format


    【解决方案1】:

    我会使用 StringBuilder 并通过在计数器中跟踪行长度自己放入填充。

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

    【讨论】:

      【解决方案2】:

      试试这个:

         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
      

      【讨论】:

        【解决方案3】:

        使用字符串格式的方法可以很容易地完成:

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

        这将给出我想要的输出。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-09-24
          • 2021-04-26
          • 2013-09-27
          • 2023-03-30
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-07-20
          相关资源
          最近更新 更多