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

sar*_*ota 14 java

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

123.45
 99
 23.2
 45
Run Code Online (Sandbox Code Playgroud)

当我使用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));
}
Run Code Online (Sandbox Code Playgroud)

它产生:

123.45
99
23.2
45
Run Code Online (Sandbox Code Playgroud)

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

Rea*_*wTo 17

试试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);
}
Run Code Online (Sandbox Code Playgroud)

输出是:

123.45
 99.00
 23.20
 45.00
Run Code Online (Sandbox Code Playgroud)


pol*_*nts 7

通过一些正则表达式字符串替换,这是微不足道的.

formatter.format(f).replaceAll("\\G0", " ")
Run Code Online (Sandbox Code Playgroud)

这是在上下文中:( 另见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);
    }
Run Code Online (Sandbox Code Playgroud)

它使用DecimalFormat做大部分格式(零填充,可选的#,等等),然后使用String.replaceAll(String regex, String replacement)替换所有前导零空间.

正则表达式是\G0.也就是说,0前面\G是"前一场比赛的结束"锚点.该\G也出现在字符串的开头,这是什么让前导零(并且没有其他零)进行匹配,并用空格代替.

参考


关于转义序列

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

参考

相关问题


其他提示

请注意,我使用了for-each循环,这样可以使代码更加简单,从而提高可读性并最大限度地减少出错的可能性.我也不停的浮点变量float,使用f后缀为它们申报为float文本(因为他们是double在默认情况下以其他方式),但它需要说,通常,你应该更喜欢doublefloat.

也可以看看


Ben*_*ine 1

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

DecimalFormat formatter = new java.text.DecimalFormat("0000.00");
Run Code Online (Sandbox Code Playgroud)

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

  • 这会导致额外的前导零打印在前面,例如:099.0,但我想要的是 [space]99.0 (3认同)