2013-11-08 1 views
1

Я хочу выровнять столбец с поплавками в десятичной точке. Я знаю, что это легко сделать, если вы ограничиваете точки после десятичной, но я хочу, чтобы пользователь мог вводить неограниченное число и длину.Выровнять столбец с поплавками в десятичной точке Java

Вот часть моей программы, касающиеся выравнивания поплавка:

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 

нужно лучшее решение для выравнивания поплавки различной длины.

+0

использование tabs.и десятичный трансформатор –

ответ

1

Чтобы сделать его гибким, вы можете добавить только несколько строк кода к тому, что у вас уже есть. Во-первых, давайте выясним, что это самый длинный число цифр перед точкой:

int LENGTH = 3; 
int longestCountBeforeDecimalPoint = 0; 

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

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

Затем, вместо того, чтобы использовать ваши «если» условия, добавьте эту строку, которая будет использовать местоположение десятичной точки вы нашли ранее, и в основном делает то, что вы делаете, но с дополнительной гибкости:

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

В выходных данных, вы будете иметь все Num в соответствии с запросом.

Протестировано со случайно генерируемыми 10000 номерами, все были выровнены в месте точки.

LENGTH указывает, сколько цифр пользователь вводит. Конечно, это может быть более гибкими, а также, например, прекращение ввода чисел, когда некоторые специальные символы вводятся и т.д.

+0

Спасибо Melquiades, это действительно помогло мне! –

+0

Добро пожаловать в Wilf. – Melquiades

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 у вас есть количество цифр перед точкой, так что вы можете легко создать Формат вывода с неограниченными цифрами после точки и правильное количество цифр перед ним.

0

Чтобы получить позицию десятичной точки в каждой строке, вы можете использовать метод indexOf() для этого. Таким образом, вы можете заполнить массив 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", "")); 
} 
+0

А! Brilliant. И можете использовать indexOf для другой проблемы, которую у меня есть! Спасибо R.J –

+0

@WilfEngel - Рад, что это вам помогло, потому что было довольно неожиданно, что вы посмотрели на этот ответ через 2 дня! :) – SudoRahul

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

Выход: Формат

Float :% 18.10f

Value 0: 3265.3265999999 
Value 1: 8823999.3650000000 
Value 2:  254.3256000000 
Value 3:  123.0000000000 
Смежные вопросы