1

我想在小数点处对齐一列浮点数。我知道如果你限制小数点后的点很容易,但我希望用户能够输入无限数量和长度的浮点数。

这是我的程序中处理浮动对齐的部分:

String[] input = new String[3];
    System.out.format("%n%n\tEnter three floating point numbers%n");
    for (int i=0;i<3;i++)
        input[i] = in.nextLine();

    System.out.format("\tHere they are lined up on their decimal point%n");

/*This is used to find decimal location in each string*/
    int[] decLoc = new int[3];
    for (int i=0; i<3; i++)
    {
        for(int j=1; j<=input[i].length();j++)
            if(input[i].charAt(j-1) == '.') 
                decLoc[i] = j;
    }
/*print 5 spaces before number if the decimal is at place 0, 4 spaces for 1...*/ 
    for(int i=0;i<3;i++)
    {
        if(decLoc[i]==0) System.out.print("      ");
        else if(decLoc[i]==1) System.out.print("     ");
        else if(decLoc[i]==2) System.out.print("    ");
        else if(decLoc[i]==3) System.out.print("   ");
        else if(decLoc[i]==4) System.out.print("  ");
        else if(decLoc[i]==5) System.out.print(" ");

        System.out.println(input[i]);
    }

输出:

        Enter three floating point numbers
3265.3265
23.365
254.3256
        Here they are lined up on their decimal point
 3265.3265
   23.365
  254.3256

需要更好的解决方案来对齐不同长度的浮动。

4

4 回答 4

1

为了使其灵活,您只需在已有的代码中添加几行代码。首先,让我们找出点之前的最长位数是多少:

int LENGTH = 3;
int longestCountBeforeDecimalPoint = 0;

for (int i=0; i<LENGTH; i++) {
    int indexOfDot = input[i].indexOf(".");

    if (longestCountBeforeDecimalPoint < indexOfDot) {
        longestCountBeforeDecimalPoint = indexOfDot;
    }
}

然后,不要使用您的“if”条件,而是添加这一行,它将利用您之前找到的小数点的位置,并且基本上可以执行您正在做的事情,但增加了灵活性:

for (int j=0; j<longestCountBeforeDecimalPoint - decLoc[i] + 1; j++) {
    System.out.print(" ");
}

完整代码:

Scanner in = new Scanner(System.in);

int LENGTH = 3;
String[] input = new String[LENGTH];
System.out.format("%n%n\tEnter three floating point numbers%n");
for (int i=0; i<LENGTH; i++)
    input[i] = in.nextLine();

//finds the longest number of digits before the dot
int longestCountBeforeDecimalPoint = 0;

for (int i=0; i<LENGTH; i++) {
    int indexOfDot = input[i].indexOf(".");

    if (longestCountBeforeDecimalPoint < indexOfDot) {
        longestCountBeforeDecimalPoint = indexOfDot;
    }
}

System.out.format("\tHere they are lined up on their decimal point%n");

/*This is used to find decimal location in each string*/
int[] decLoc = new int[LENGTH];
for (int i=0; i<LENGTH; i++)
{
    //as R.J noted below, finding dot place can be done like this
    decLoc[i] = input[i].indexOf('.');
}

/*print 5 spaces before number if the decimal is at place 0, 4 spaces for 1...*/ 
for(int i=0; i<LENGTH; i++)
{
    //add spaces
    for (int j=0; j<longestCountBeforeDecimalPoint - decLoc[i] + 1; j++) {
        System.out.print(" ");
    }

    System.out.println(input[i]);
}

在输出中,您将按照要求将所有数字对齐在点位置。

用随机生成的 10000 个数字进行测试,所有数字都在点位置对齐。

LENGTH 指定用户将输入多少个数字。当然,这也可以做得更灵活一些,比如在输入一些特殊字符时终止输入数字等。

于 2013-11-08T13:01:28.820 回答
0

您可以只编写代码来计算点之前的最大位数,例如双精度数:

double[] theNumbers = new double[5];
double[0] = 1324.5314564;
double[1] = 24.4;
double[2] = 0.2574;
double[3] = -56.77;
double[4] = -2.0;

int maxDigitsBeforeDot = 0;
int actExponent = 0;
boolean found = false;

while(!found) {
    found = true;
    for(double act : theNumbers) {
        if(Math.abs(act) >= Math.pow(10,actExponent)) { found = false; }
    }
    actualExponent++;
}

maxDigitsBeforeDot = actExponent;

有了maxDigitsBeforeDot点之前的位数,因此您可以轻松地创建一个输出格式,在点之后有无限位数,并且在它之前有正确的位数。

于 2013-11-08T11:42:28.897 回答
0

要获取每个字符串中小数点的位置,可以使用indexOf()of 方法。这样您就可以填充decLoc数组。

for (int i = 0; i < 3; i++) {
    decLoc[i] = input[i].indexOf('.');
}

if要打印,您可以使用一种方法来打印编号,而不是执行此操作。基于传递的参数的空格,您可以for在打印数据的地方调用此方法。

void printSpaces(int n) {
    System.out.print(String.format("%" + n + "s", ""));
}
于 2013-11-08T11:42:35.263 回答
0

这是一种动态方法:

public class FloatFormatter {
    String[] values;
    String format;

    public static void main(String[] args) {
        String[] input = new String[] {
                "3265.3265999999",
                "8823999.365",
                "254.3256",
                "123"};

        FloatFormatter f = new FloatFormatter(input);
        f.printFormattedValues();
    }

    public FloatFormatter(String[] values) {
        setValues(values);
    }

    public void setValues(String[] values) {
        this.values = values;
        updateFormat();
    }

    public String getFormat() {
        return format;
    }

    public void printFormattedValues() {
        System.out.printf("Float format: %s\n\n", getFormat());
        for (int i = 0; i < values.length; i++) {
            System.out.printf(String.format("Value %%d: %s\n", getFormat()),
                    i, Double.parseDouble(values[i]));
        }
    }

    protected void updateFormat() {
        byte[] lenAndFigs = getLengthAndSigFigs();
        format = String.format("%%%d.%df", lenAndFigs[0], lenAndFigs[1]);
    }

    private final byte[] getLengthAndSigFigs() {
        byte length = 0, sigFigs = 0;
        String[] parts;

        for (String value : values) {
            parts = value.split("\\.");
            length = (byte) Math.max(length, parts[0].length());

            if (parts.length > 1)
                sigFigs = (byte) Math.max(sigFigs, parts[1].length());
        }

        return new byte[] { (byte) (length + sigFigs + 1), sigFigs };
    }
}

输出:

浮点格式:%18.10f

Value 0:    3265.3265999999
Value 1: 8823999.3650000000
Value 2:     254.3256000000
Value 3:     123.0000000000
于 2013-11-09T19:50:12.747 回答