代码之家  ›  专栏  ›  技术社区  ›  A Biron

(Java String.format)无法将此列设置为固定宽度

  •  1
  • A Biron  · 技术社区  · 7 年前

    首先,如果像这样的问题已经得到了回答,我道歉。我试图搜索任何类似的问题,但没有找到任何类似的问题(至少在我使用的关键字方面)。请根据需要调节!这是我在网站上的第一篇帖子。

    我在练习弦乐。在Java中格式化,并且在使我的“Name”列的元素都具有相同的宽度时遇到问题。如果相关的话,我正在使用JDK 9。在我下面的代码中,所讨论的问题在for循环块中。我从各自的字符串数组中提取名字和姓氏。我知道如果我把每个全名都做成一个字符串,我就可以解决我的问题,但是为了这个练习,为了进一步提高我的Java技能,我想知道是否有解决这个问题的方法。谢谢:)

    public static void grades() {
        Random rand = new Random();
        // final grade is calculated based on points achieved out of 45. Rounded to 1 decimal
        String[] rosterFirst = {"Harry", "Seamus", "Dean", "Neville", "Ron", "Dennis"};
        String[] rosterLast = {"Potter", "Finnegan", "Thomas", "Longbottom", "Weasley", "Creevey"};
    
        System.out.println("2018 Hogwarts Graduating Class Scores \n" +
            String.format("%2$-25s %1$-12s", "Grade", "Name"));
    
        for (int i = 0; i < rosterFirst.length; i++) {
            double finalGrade = (25 + rand.nextDouble() * 20) / 45 * 100;
            System.out.println(String.format("%s, %-15s %-12.1f", rosterLast[i], rosterFirst[i], finalGrade));
        }
    }
    

    输出:

    2018 Hogwarts Graduating Class Scores 
    Name                      Grade       
    Potter, Harry         70.3
    Finnegan, Seamus         75.9
    Thomas, Dean         96.9
    Longbottom, Neville         98.2
    Weasley, Ron         58.7
    Creevey, Dennis         76.0
    

    (不确定此帖子中的代码输出格式是否错误。如果错误,请更正我)

    1 回复  |  直到 7 年前
        1
  •  2
  •   user2864740 Heinzi    7 年前

    当前的问题是姓氏(第一个参数)没有固定的宽度。随着姓氏宽度的变化,这将“弄乱”字符串的其余部分。此外,无法使用指定其他参数的绝对位置 String.format 单独地宽度格式仅影响相对位置。

    获得所需行为的一种简单方法是指定 全名 作为具有固定宽度的单个字段,即:

    String fullName = rosterLast[i] + ", " + rosterFirst[i];
    
    System.out.println(
      String.format("%-20s %-12.1f", fullName, finalGrade));
    

    现在只有 实际提供给格式的参数,以及 二者都 指定固定宽度。逗号为 部分 全名的宽度避免了单个名称组件和逗号之间的固定宽度交互。