我有以下代码:
private String padWithZeroRightToPeriod(String serverFormat, float unformattedNumber, int index) {
int nDigits = getNumberOfDigitsAfterPeriod(serverFormat);
String floatingFormat = "%4." + nDigits + "f";
String formattedPrice = String.format(floatingFormat, unformattedNumber);
当以
unformattedNumber
为846
进行调用时,为什么结果为" 846"
(一个空格,然后是三个数字)?%4.
是什么意思? 最佳答案
docs for String.format
将您引向this documentation on format strings,其中说:
常规,字符和数字类型的格式说明符具有以下语法:
%[argument_index$][flags][width][.precision]conversion
可选的arguments_index是一个十进制整数,指示参数在参数列表中的位置。第一个参数由“ 1 $”引用,第二个参数由“ 2 $”引用,依此类推。
可选标志是一组修改输出格式的字符。有效标志集取决于转换。
可选宽度是一个正的十进制整数,指示要写入输出的最小字符数。
可选精度是非负十进制整数,通常用于限制字符数。具体行为取决于转换。
所需的转换是一个字符,指示应如何格式化参数。给定参数的有效转换集取决于参数的数据类型。
从示例输出中,看来getNumberOfDigitsAfterPeriod
正在重现0
,因此您的格式字符串为%4.0f
。所以:
它没有参数索引($
之后没有4
)
它具有宽度(4
)
它具有精度(0
)
当然还有转换(f
)
由于宽度为4,所以846作为" 846"
输出。所讨论的宽度是输出的字符总数。这是另一个示例:Live Copy
public class Example {
public static void main(String args[]) {
System.out.println(String.format("%8.2f", 846.0));
System.out.println(String.format("%8.2f", 42.4));
}
}
输出:
846.00
42.40
请注意,每个字符都有八个字符长。