1

float の列を小数点に揃えたい。小数点以下のポイントを制限すると簡単に実行できることはわかっていますが、ユーザーが無制限の数と長さの浮動小数点数を入力できるようにしたいと考えています。

これは、フロートアライメントを扱う私のプログラムの一部です:

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

これは動的なアプローチです。

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 に答える