在printf格式化字符串中动态设置字段宽度

时间:2015-03-24 18:39:51

标签: java format

我试图打印出8puzzle游戏的表格表示。

我知道如何使用打印格式,即printf("%2s", ..)等等,但我不确定如何根据正在播放的电路板大小(可能是3x3,5x5,......)来改变它

我可以通过编码获得最大数量的长度:

String.valueOf(Side*Side - 1).length()

并将其存储在int中。那么我如何获得那个int来替换上面printf示例中的2?

有更好的方法吗?感谢。

2 个答案:

答案 0 :(得分:0)

要将整数作为字段长度的格式,只需将其连接为字符串的一部分:

int maxWidth = String.valueOf(Side*Side - 1).length();
printf( "%" + maxWidth + "s", .... );

格式化字符串就像任何其他字符串一样。

答案 1 :(得分:0)

您想要的是动态构建模板String,并将所有内容放入其中。例如,对于3x3电路板,您可能需要模板"%n\t%n\t%n\n%n\t%n\t%n\n%n\t%n\t%n",如果提供9个数字输入,模板将在控制台上打印为3x3网格。要构建模板,请执行以下操作:

public String makeTemplate(size){
    StringBuilder builder = new StringBuilder();
    for(int i = 0;i < size;i++){
        for(int i = 0;i < size-1;i++){
            builder.append("%n\t");
        }
        builder.append("%n\n");
    }
    return builder.toString();
}

使用此类型方法生成的模板来正确格式化输出。使用示例如下所示

public void someMethod(){
    int[] numbers = new int[9]; //fill in array with numbers
    String template = makeTemplate(3);
    String formatted = String.format(template,numbers);
    System.out.println(formatted);
}