【问题标题】:Java printf using variable field size?Java printf使用可变字段大小?
【发布时间】:2010-03-31 02:41:31
【问题描述】:

我只是想将一些 C 代码转换为 Java,我在使用 String.printf 时遇到了一些问题。

在 C 中,要根据变量获取特定宽度,我可以使用:

printf("Current index = %*d\n", sz, index);

它会将整数格式化为基于sz的特定大小。

尝试:

System.out.println(String.format("Current index = %*d\n", sz, index));

导致错误,因为它不喜欢 *

我目前有以下杂物:

System.out.println(String.format("Current index = %" + sz + "d\n", index));

但我希望有更好的方法,是吗?

【问题讨论】:

  • 使用 println(String.format) 是多余的。你应该使用 printf 方法。

标签: java string formatting printf


【解决方案1】:

在使用printf之前声明一个额外的变量:

String format = "%" + fieldSize + "d";
System.out.printf(format, yourVariables);

(这是我从网络搜索中找到的第一个解决方案)

【讨论】:

  • 这和他做的基本一样,只是你分两行做同样的事情。
  • 对不起,我看不出这个答案有什么用,因为它对问题没有任何帮助。
【解决方案2】:

可以说这并不比你的“kludge”好,但这里有一个方法可以嵌入到对printf 的调用中,它将用宽度替换你传递给它的星号。其结果用作真实格式。 例如,考虑这个调用:

System.out.printf("%04d %2s %-7d;%n", 65, "a", 6);

我将通过嵌入函数替换第一个和第三个宽度:

System.out.printf( wf("%0*d %2s %-*d;%n", 4, 7), 65, "a", 6);

这是代码:

public static String wf(String fmt, int... widths) {
    return metaWidthFormat('*', fmt, widths);
}

public static String metaWidthFormat(char wmeta, String fmt, int ... widths) {
    if (fmt == null) return null;
    int wix = 0;
    boolean outside = true;
    // initial capacity is sufficient for each substituted width to be 2 digs
    StringBuilder result = new StringBuilder(fmt.length() + widths.length);
    for (char ch : fmt.toCharArray()) {
        if (outside) {
            result.append(ch);
            outside = (ch != '%');
        } else {
            if (ch == wmeta) {
                result.append(widths[wix++]);
            } else {
                result.append(ch);
            }
            outside = (ch == wmeta) || (ch == '%') || Character.isAlphabetic(ch);
        }
    }
    return result.toString();
}

【讨论】:

    【解决方案3】:

    假设索引适合 sz 你可以这样做:

    char[] temp = new char[sz];
    Arrays.fill(temp, '0');
    DecimalFormat df = new DecimalFormat(new String(temp));
    System.out.println(String.format("Current index = %s\n", df.format(index))); 
    

    注意,通过不使用Format 或其任何子类,没有Locale 依赖字符,如''、'。'或 ',' 添加到输出中。

    【讨论】:

      【解决方案4】:

      也许为时已晚,但把它放在这里给别人

      int width = 5;
      int precision = 2;
      float f = 12.34567f;
      System.out.printf("%"+width+"."+precision+"f%n",f);
      

      在 java 1.8 中测试

      【讨论】:

      • @tilde 不完全一致,请花些时间比较差异
      • 不,不完全是。您还设置了精度。但实质是一样的——首先,用 + 定义格式字符串,然后将其传递给 printf。
      猜你喜欢
      • 2011-05-07
      • 1970-01-01
      • 2022-11-18
      • 2011-08-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多