格式化具有相同填充量的数字
我想在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
tofloat
。
只需更改第一行,将’#’字符替换为’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),它将返回两个空格。