我正在尝试格式化字符串,以便它始终以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]);
}
谢谢!
答案 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将处理纯整数(如果有),这样您将始终获得相同的数字长度。