【问题标题】:Why does `%4.` add space to my number?为什么 `%4.` 给我的号码添加空格?
【发布时间】:2014-06-22 09:44:17
【问题描述】:

我有这个代码:

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

【问题讨论】:

  • 您看过 Javadocs 吗?您是否尝试过任何其他输入来理解行为?
  • 无法在 java 文档中很好地搜索它。使用什么术语?字符串格式化程序没有帮助
  • “没有帮助”是什么意思? It's very well documented%[argument_index$][flags][width][.precision]conversion.
  • @BoristheSpider 这意味着%[argument_index$][flags][width] 我不清楚。我可以尝试一些示例,但我想了解行为而不是猜测。
  • 不,但他的例子做到了。

标签: java string formatting format string-formatting


【解决方案1】:

docs for String.format 将您推荐给this documentation on format strings,上面写着:

通用、字符和数字类型的格式说明符具有以下语法:

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

可选的argument_index是一个十进制整数,表示参数在参数列表中的位置。第一个参数由“1$”引用,第二个由“2$”引用,依此类推。

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

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

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

必需的conversion 是一个字符,表示参数的格式。给定参数的有效转换集取决于参数的数据类型。

从您的示例输出中,getNumberOfDigitsAfterPeriod 似乎正在返回0,因此您的格式字符串为%4.0f。所以:

  • 它没有参数索引4 后面没有$
  • 它有一个宽度 (4)
  • 它有一个精度 (0)
  • 当然它有一个转换 (f)

所以 846 输出为 " 846",因为宽度为 4。所讨论的宽度是 total 输出的字符数。这是一个不同的例子: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

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

【讨论】:

  • It has a width (4)。 42.4 的宽度是 4 吗?
  • @user1065869:是的,宽度是“要写入输出的最小字符数”(例如,总数)。但是鉴于您的示例输出" 846"),显然getNumberOfDigitsAfterPeriod 正在返回0String.format("%4.0f", 42.4) 返回 " 42"(两个空格后跟 42)。
猜你喜欢
  • 1970-01-01
  • 2015-08-30
  • 1970-01-01
  • 2017-08-16
  • 1970-01-01
  • 2017-07-06
  • 2017-07-02
  • 2013-01-01
  • 2022-06-16
相关资源
最近更新 更多