格式化字符串输出

时间:2014-03-29 00:21:35

标签: java string format printf string-formatting

我正在尝试格式化字符串,以便它始终以3的宽度打印出来,尽管数字有多大,但仍以相同的行结束。每个数字,但一个是小于十的小数;但是,当我打印十分之一以上的小数时,宽度为4,结束前一个数字的最后一位数。我想这样做,以便它们都在同一个地方结束并在右边排成一行。如何在Java中使用printf来完成这个?

[a 4.34]
[b 0.32]
[c 12.52]

我希望每个人都这样排队

[a 4.34]
[b 0.32]
[c 12.5]

这是我已打印的行

for(int i = 0; i < 26;i++)
{
    System.out.printf("[%c %3.2f]\n", letters[i], frequencies[i]);
}

谢谢!

3 个答案:

答案 0 :(得分:1)

如果要根据最宽的行使得到的宽度不同,请使用给出的答案user1544460,或者只使用相同的if-then-else结构定义多个print语句。如果您始终希望宽度相同(最大值),则需要在格式化字符串中指定更多数字。

“%3.2f”表示“我想要一个总共至少有3个空格的数字,其中两个我希望在小数点后面找到它的值。”

更改

System.out.printf("[%c %3.2f]\n", letters[i], frequencies[i]);

System.out.printf("[%c %5.2f]\n", letters[i], frequencies[i]);

假设最大值的小数点左边有3位数。

如果您希望它动态工作,并调整大小以适应最大的行,请执行以下操作:

if(maxNum >= 100)
    System.out.printf("[%c %5.2f]\n", letters[i], frequencies[i]);
else if(maxNum >= 10)
    System.out.printf("[%c %4.2f]\n", letters[i], frequencies[i]);
else // If we get here, we've either coded something wrong, or it's less than 10.
    System.out.printf("[%c %3.2f]\n", letters[i], frequencies[i]);

答案 1 :(得分:0)

替换

System.out.printf("[%c %3.2f]\n", letters[i], frequencies[i]);

System.out.printf("[%c %3.3g]\n", letters[i], frequencies[i]);

"g"表示significant figures而不是小数点后的位置,因此使用3。

有关详细信息,请参阅Javadoc for the formatter

答案 2 :(得分:0)

假设数字总是小于100

private static DecimalFormat df1digit = new DecimalFormat("0.00");
private static DecimalFormat df2digit = new DecimalFormat("#.00");
private static DecimalFormat df3digit = new DecimalFormat("##.0");

您可以将数字与10和1进行比较,使用相关的十进制格式。你可以扩展这个想法,以格式化数百万,数十亿等。

if(x>10){
    System.out.println(df3digit.format(x));
}else if(x>1){
    System.out.println(df2digit.format(x));
}else{
    System.out.println(df1digit.format(x));
}
格式字符串中的

0将处理纯整数(如果有),这样您将始终获得相同的数字长度。