我想在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个空格?
答案 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的字符串,包含反斜杠。
'\"'
the same as '"'
?(backslash-doublequote vs only-doublequote) 请注意,我使用了for-each
循环,从而产生了更简单的代码,从而提高了可读性并最大限度地减少了出错的可能性。我还将浮点变量保留为float
,使用f
后缀将它们声明为float
文字(因为默认情况下它们是double
),但是需要说明的是,您通常应该选择double
到float
。
double
至float
。答案 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),它将返回两个空格。