格式化具有相同填充量的数字

时间:2010-07-26 22:42:50

标签: java

我想在Java中格式化3位浮点数,以便它们垂直排列,使得它们看起来像:

123.45
 99
 23.2
 45

当我使用DecimalFormat类时,我会接近,但是当项目有1或2位数时我想插入空格。

我的代码:

DecimalFormat formatter = new java.text.DecimalFormat("####.##");
float [] floats = [123.45, 99.0, 23.2, 45.0];

for(int i=0; i<floats.length; i++)
{
    float value = floats[i];

    println(formatter.format(value));
}

它产生:

123.45
99
23.2
45

如何打印它以使除第一行以外的所有行都移过1个空格?

6 个答案:

答案 0 :(得分:15)

尝试使用String.format()JavaDoc):

public static void main(String args[]){
  String format = "%10.2f\n";  // width == 10 and 2 digits after the dot
  float [] floats = {123.45f, 99.0f, 23.2f, 45.0f};
  for(int i=0; i<floats.length; i++) {
      float value = floats[i];
      System.out.format(format, value);
}

,输出为:

123.45
 99.00
 23.20
 45.00

答案 1 :(得分:7)

这对于一些正则表达式字符串替换来说是微不足道的。

formatter.format(f).replaceAll("\\G0", " ")

这是在上下文中:(see also on ideone.com):

    DecimalFormat formatter = new java.text.DecimalFormat("0000.##");
    float[] floats = {
        123.45f,     //  123.45
         99.0f,      //   99
         23.2f,      //   23.2
         12.345f,    //   12.35
           .1234f,   //     .12
        010.001f,    //   10
    };

    for(float f : floats) {
        String s = formatter.format(f).replaceAll("\\G0", " ");
        System.out.println(s);
    }

这使用DecimalFormat来完成大部分格式化(零填充,可选#等),然后使用String.replaceAll(String regex, String replacement)将所有前导零替换为空格。

正则表达式模式为\G0。也就是说,0前面有\G,这是“上一场比赛结束”的锚点。 \G也出现在字符串的开头,这是允许前导零(没有其他零)匹配并用空格替换的内容。

参考


关于转义序列

将模式\G0写为"\\G0"作为Java字符串文字的原因是因为反斜杠是转义字符。也就是说,"\\"是一个长度为1的字符串,包含反斜杠。

参考

相关问题


其他提示

请注意,我使用了for-each循环,从而产生了更简单的代码,从而提高了可读性并最大限度地减少了出错的可能性。我还将浮点变量保留为float,使用f后缀将它们声明为float文字(因为默认情况下它们是double),但是需要说明的是,您通常应该选择doublefloat

另见

答案 2 :(得分:1)

只需更改第一行,将'#'字符替换为'0'即可。它将解决您的问题并生成具有相同长度的格式化数字,如Java API中所述。使用该方法,您的行将以其他“0”数字(例如099.00)开始和结束:

DecimalFormat formatter = new java.text.DecimalFormat("0000.00");

如果你想要没有这些无用的'0'的正确对齐,你必须创建自己的格式化方法:它在本机Java API中不存在。

答案 3 :(得分:1)

与Benoit的回答一样,这里有一个扩展DecimalFormat的类,它通过左边填充带空格的格式化数字来确保指定的最小长度。它已经过测试(Java 6,7),更为通用,并提供了一个工作示例。

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;
import java.text.FieldPosition;

public class PaddingDecimalFormat extends DecimalFormat {
    private int minimumLength;

    /**
     * Creates a PaddingDecimalFormat using the given pattern and minimum minimumLength and the symbols for the default locale.
     */
    public PaddingDecimalFormat(String pattern, int minLength) {
        super(pattern);
        minimumLength = minLength;
    }

    /**
     * Creates a PaddingDecimalFormat using the given pattern, symbols and minimum minimumLength.
     */
    public PaddingDecimalFormat(String pattern, DecimalFormatSymbols symbols, int minLength) {
        super(pattern, symbols);
        minimumLength = minLength;
    }

    @Override
    public StringBuffer format(double number, StringBuffer toAppendTo, FieldPosition pos) {
        int initLength = toAppendTo.length();
        super.format(number, toAppendTo, pos);
        return pad(toAppendTo, initLength);
    }

    @Override
    public StringBuffer format(long number, StringBuffer toAppendTo, FieldPosition pos) {
        int initLength = toAppendTo.length();
        super.format(number, toAppendTo, pos);
        return pad(toAppendTo, initLength);
    }

    private StringBuffer pad(StringBuffer toAppendTo, int initLength) {
        int numLength = toAppendTo.length() - initLength;
        int padLength = minimumLength - numLength;
        if (padLength > 0) {
            StringBuffer pad = new StringBuffer(padLength);
            for(int i = 0; i < padLength; i++) {
                pad.append(' ');
            }
            toAppendTo.insert(initLength, pad);
        }
        return toAppendTo;
    }

    public static void main(String[] args) {
        PaddingDecimalFormat intFormat = new PaddingDecimalFormat("#", 6);
        for (int i = 0; i < 20; i++) {
            System.out.println(intFormat.format(i) + intFormat.format(i*i*i));
        }
    }
}

答案 4 :(得分:0)

应该回答你的问题的方法(我在这里直接写了它并没有测试它,所以你可能有一些错误需要纠正,但至少,你明白了):

public class PaddingDecimalFormat extends DecimalFormat {

    private int maxIntLength = 1;

    public PaddingDecimalFormat(String pattern) {
        super(pattern);
    }

    public void configure(Number[] numbers) {
        for(Number number : numbers) {
             maxIntLength = Math.max(maxIntLength, Integer.toString(number.intValue()).length()); 
        }
    }

    @Override
    public void format(Number number) {
        int padding = maxIntLength - Integer.toString(number.intValue()).length();

        StringBuilder sb = new StringBuilder();

        for(int i=0; i<padding; i++) {
            sb.append(' ');
        }

        sb.append(super.format(number));

        return sb.toString();
    }
}

答案 5 :(得分:-1)

想象一下分号和System.out。格式化程序如上所述。

printf ("   ".substring (("" + Math.round (f)).length ) + formatter.format (f))

我更喜欢使用log-10-Function来计算999或100到3的大小,而不是隐含的toString-call,但我只是找到了自然对数。

Math.round(987.65)给出987 (“”+ 987).length给出3
“___”。substring(3)是空字符串,对于短数字(0-9),它将返回两个空格。