我有以下代码:

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.是什么意思?

最佳答案

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

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

08-06 19:39