为什么`%4.`会为我的号码增加空间?

时间:2014-06-22 09:44:18

标签: java string formatting format string-formatting

我有这段代码:

private String padWithZeroRightToPeriod(String serverFormat, float unformattedNumber, int index) {
    int nDigits = getNumberOfDigitsAfterPeriod(serverFormat);
    String floatingFormat = "%4." + nDigits + "f";
    String formattedPrice = String.format(floatingFormat, unformattedNumber);

unformattedNumber846时,为什么结果为" 846"(空格,然后是三位数)?

%4.是什么意思?

1 个答案:

答案 0 :(得分:2)

docs for String.format会向您推荐this documentation on format strings,其中包含:

  

常规,字符和数字类型的格式说明符具有以下语法:

     

%[argument_index$][flags][width][.precision]conversion

     

可选的 argument_index 是十进制整数,表示参数列表中参数的位置。第一个参数由" 1 $"引用,第二个参数由" 2 $"等引用。

     

可选的标志是一组修改输出格式的字符。有效标志集取决于转换。

     

可选的 width 是一个正十进制整数,表示要写入输出的最小字符数。

     

可选的精度是一个非负十进制整数,通常用于限制字符数。具体行为取决于转换。

     

所需的转换是一个字符,指示如何格式化参数。给定参数的有效转换集取决于参数的数据类型。

在您的示例输出中,似乎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.00
   42.40

请注意,每个长度都是八个字符。