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

我想在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个空格?

尝试使用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 

输出是:

 123.45 99.00 23.20 45.00 

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

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

这是在上下文中:( 另见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也出现在字符串的开头,这是允许前导零(并且没有其他零)匹配并用空格替换的内容。

参考

  • java.util.regex.Pattern
  • regular-expressions.info – 继续比赛

关于转义序列

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

参考

  • JLS 3.10.6字符和字符串文字的转义序列

相关问题

  • 如何用单斜杠替换特殊字符
  • char字面'\"''"' '\"'相同吗?(反斜杠 – 双引号vs only-doublequote)

其他提示

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

也可以看看

  • Java语言指南/ For-each循环
  • Java Puzzlers :首选double to float

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

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

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

与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)); } } } 

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

 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 

想象一下分号和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),它将返回两个空格。