字符串格式

时间:2013-05-19 23:13:04

标签: java string formatting

我目前正在尝试构建一个程序,通过调用一个方法来构造三角形高度为int参数的方法,以打印不同高度的Pascal三角形。当试图运行我的程序时,第一个Pascal的三角形打印出来然后我得到一个异常错误,读到这个:

java.util.FormatFlagsConversionMismatchException: Conversion = s, Flags = 0
at java.util.Formatter$FormatSpecifier.failMismatch(Unknown Source)
at java.util.Formatter$FormatSpecifier.checkBadFlags(Unknown Source)
at java.util.Formatter$FormatSpecifier.checkGeneral(Unknown Source)
at java.util.Formatter$FormatSpecifier.<init>(Unknown Source)
at java.util.Formatter.parse(Unknown Source)
at java.util.Formatter.format(Unknown Source)
at java.io.PrintStream.format(Unknown Source)
at PascalsTriangle.drawTriangle(PascalsTriangle.java:19)
at PascalsTriangle.main(PascalsTriangle.java:39)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:272)
  

通过调试,我注意到我在第19行中如何格式化String输出存在一个问题。我对Java编程很新,我试图在我的代码中解决不同的格式问题,但我一直难倒如何使这项工作。关于如何防止发生此异常错误的任何建议?

以下是我的程序的代码:

public class PascalsTriangle {

  private int height;

  public void drawTriangle(int height) {
    System.out.println("A Pascal Triangle with height " + height);
    for(int i = 0; i <= height; i++) {
      int number = 1;
      System.out.format("%" + ((height-i) * 2) + "s", " ");

      for(int j = 0; j <= i; j++) {
        System.out.format("%5d", number);
        number = number * (i - j) / (j + 1);

      }
    System.out.println();   
    }
  }



  public static void main(String[] args) {

    PascalsTriangle pascal = new PascalsTriangle();

    pascal.drawTriangle(4);
    pascal.drawTriangle(10);
    pascal.drawTriangle(7);
    pascal.drawTriangle(2);
  }
}

3 个答案:

答案 0 :(得分:1)

您可以为格式说明符定义最小填充宽度,以防止出现无效0大小的宽度:

int padWidth = Math.max(1, ((height - i) * 2));
System.out.format("%" + padWidth + "s", " ");

答案 1 :(得分:1)

由于您在for循环中正在i <= height进行迭代,因此i可能会height创建"%0s",这是不正确的({1}} %之后的数字必须是正数或负数。尝试在代码中添加+ 1

System.out.format("%" + ((height - i + 1) * 2) + "s", " ");
//                                   ^here

i应该是行数,将i <= height更改为i < height

更新

我不确定这是否就是你在评论中的意思,但也许可以这样做:

public void drawTriangle(int height) {
    System.out.println("A Pascal Triangle with height " + height);
    for (int i = 0; i <= height; i++) {
        int number = 1;
        if (i != height)
            System.out.format("%" + ((height - i) * 2) + "s", " ");

        for (int j = 0; j <= i; j++) {
            if (j == 0)
                System.out.print(number);
            else
                System.out.format("%4d", number);
            number = number * (i - j) / (j + 1);

        }
        System.out.println();
    }
}

我添加了一些条件,这些条件会阻止在最后一行插入空格以及在连续打印第一个1时。同时将%5d更改为%4d以创建更多“平衡三角形”。如果您希望将其设置为“宽度”,请将%4d更改为%6d并使用"%" + ((height - i) * 3) + "s"(3是%6d的一半,因此%8d使用((height - i) * 4)) {{1}}

答案 2 :(得分:0)

即使不是您问题的答案,也要提示:在String.format中使用%%,我的错误是仅对符号使用了%。