我有这样的代码:
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.
是什么意思?
String.format
的文档让您参考这个关于格式字符串的文档,它说:
通用类型、字符类型和数字类型的格式说明符具有以下语法:
%[argument_index$][flags][width][.precision]conversion
可选参数argument_index是一个十进制整数,表示实参在实参列表中的位置。第一个参数由"1$&"引用,第二个参数由"2$&"引用,以此类推。
可选的标志是一组修改输出格式的字符。有效标志的集合取决于转换。
可选的宽度是一个正十进制整数,表示写入输出的最小字符数。
可选的精度是一个非负十进制整数,通常用于限制字符的数量。具体的行为取决于转换。
所需的转换是一个字符,指示参数应该如何格式化。给定实参的有效转换集取决于实参的数据类型。
从您的示例输出中,似乎getNumberOfDigitsAfterPeriod
返回0
,因此您的格式字符串是%4.0f
。所以:
- 没有参数索引 (
4
之后没有$
) - 有宽度 (
4
) - 具有精度 (
0
) - 当然它有一个转换 (
f
)
所以846输出为" 846"
,因为宽度是4。所讨论的宽度是输出的总字符数。这里有一个不同的例子: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.0042.40 之前