使打印文本正确对齐

时间:2017-09-24 02:35:13

标签: java printf

我是一个完全新手的程序员,我对如何使用printf感到很困惑。在我的代码中使用printf是在paymentCalc方法的最后;我正在尝试将数据打印到一行,指定2个小数点进行打印,并在打印下一个输出之前将其填充10个空格。 代码根本不是格式化的。我在这做错了什么?它都是在同一行上打印,但它打印了一百万个小数,而且它似乎没有正确填充。

update firstc set sname=@sname,sage=@sage,sclass=@sclass where firstc.sid=@sid"

编辑: 我将代码更改为

/*
 * Step 1: Get starting annual interest rate
 * Step 2: Get ending annual interest rate
 * Step 3: Get increment rate
 * Step 4: Get First # of years for repayment
 * Step 5: Get Last # of years for repayment
 * Step 6: Get # of years to increment by
 * Step 7: Get loan amount
 * 
 * Convert annual rates to monthly rates MIR = Annual rate/12
 * MTP = # of years * 12
 * 
 * MIR = monthly interest rate
 * MTP = months to pay
 * Annuity Factor =(mir*(1+mir)^mtp)/(((1+mir)^mtp)-1)
 * Payment = Amount Loaned * Annuity Factor
 * 
 * 
 * Produce a list of possible loan payments
 * Based on a series of annual interest rates
 * Start at user entered rate and increment until it hits user entered max
 * Display annual payment as monthly payments
 *  */


import java.io.*;
import java.util.*;
import java.text.*;
import java.math.*;

public class methodshomework {
public static void main(String[] args) {

Scanner scanner = new Scanner(System.in);  
  //VARIABLES
  //amounts in years
  double startAnnInt = 0;
  double endAnnInt = 0;
  double incRate = 0;
  double incRatePercent = 0;
  double firstYears = 0;
  double lastYears = 0;
  double incYears = 0;
  double loanAmt = 0;
  //amounts in months
  double startMonthInt = 0;
  double endMonthInt = 0;
  double monthIncRate = 0;
  double firstMonths = 0;
  double lastMonths = 0;
  double incMonths = 0;
  double monthIncRatePercent = 0;
  double annIncRatePercent = 0;

  System.out.println("Hello, and welcome to the loan calculator");
  //Acquire necessary data
  System.out.println("What is the starting annual interest rate? (please enter as XX, where XX = XX%)");
  startAnnInt = (scanner.nextDouble()/100);
  System.out.println("What is the ending annual interest rate? (please enter as XX, where XX = XX%)");
  endAnnInt = (scanner.nextDouble()/100);
  System.out.println("What is the annual increment rate? (please enter as XX, where XX = XX%)");
  incRate = (scanner.nextDouble()/100);
  System.out.println("What is the first term for payment (in years)?");
  firstYears = scanner.nextDouble();
  System.out.println("What is the last term for payment (in years)?");
  lastYears = scanner.nextDouble();
  System.out.println("What is the term increment (in years)?");
  incYears = scanner.nextDouble();
  System.out.println("What is the loan amount? (in the form XXXXXX, where XXXXXX = $XXX,XXX)");
  loanAmt = scanner.nextDouble();


  double[] monthArray = yearToMonth(firstYears, lastYears, incYears, startAnnInt, endAnnInt, incRate);
  firstMonths = monthArray[0];
  lastMonths = monthArray[1];
  incMonths = monthArray[2];
  startMonthInt = monthArray[3];
  endMonthInt = monthArray[4];
  monthIncRate = monthArray[5];
  monthIncRatePercent = monthArray[6];
  annIncRatePercent = monthArray[7];

  paymentCalc(startMonthInt,  endMonthInt,  monthIncRate,  firstMonths,  lastMonths,  incMonths,  loanAmt,  firstYears,  lastYears,  incYears, startAnnInt, endAnnInt, incRate);

}


//MODULES HERE

public static double[] yearToMonth(double firstYears, double lastYears, double incYears, double startAnnInt, double endAnnInt, double incRate){
  double firstMonths = 0;
  double lastMonths = 0;
  double incMonths = 0;
  double startMonthInt = 0;
  double endMonthInt = 0;
  double monthIncRate = 0;
  double monthIncRatePercent = 0;
  double annIncRatePercent = 0;

  //do our conversions
  firstMonths = (firstYears * 12);
  lastMonths = (lastYears * 12);
  incMonths = (incYears * 12);
  startMonthInt = (startAnnInt / 12);
  endMonthInt = (endAnnInt / 12);
  monthIncRate = (incRate / 12);
  monthIncRatePercent = (monthIncRate/100);
  annIncRatePercent = (incRate/100);

  //put our conversions into an array
  double[] monthArray = {firstMonths, lastMonths, incMonths, startMonthInt, endMonthInt, monthIncRate, monthIncRatePercent, annIncRatePercent};

  //return our conversions
  return monthArray;
}


public static void paymentCalc(double startMonthInt, double endMonthInt, double monthIncRate, double firstMonths, double lastMonths, double incMonths, double loanAmt, double firstYears, double lastYears, double incYears, double startAnnInt, double endAnnInt, double incRate){
  double monthInt = 0;
  double monthsToPay = 0;
  double rowNumber = (((lastYears - firstYears))/incYears);
  double rowNumberWithInt = (rowNumber + 1);
  double colNumber = ((endMonthInt - startMonthInt)/monthIncRate);
  double colNumberWithTop = (colNumber+1);
  double currentYears = 0;
  double currentMonths = 0;
  double currentMonthInt = 0;
  double currentPayment = 0;
  double currentAnnInt = 0;
  double annuityAmt = 0;
 //counting columns
  for (double i = 0; i <= colNumberWithTop; i++) {
    //printing the top column
    if (i == 0){
     System.out.printf("%-10s", "Interest Rate");  
     for (double k = 0; k <= rowNumber; k++) {
         currentYears = (firstYears + (incYears * i));
         System.out.printf("%10s", currentYears + " Years"); } 
    } else if (i > 0) {
      //finding annual interest rate for printing, and monthly interest rate as a decimal for math
      currentAnnInt = (startAnnInt + (incRate * i));
      currentMonthInt = ((currentAnnInt/100)/12);
      System.out.printf("%.2f10s\n", (currentAnnInt * 100));
      for (double k = 0; k <= rowNumber; k++) {
           monthsToPay = (startMonthInt + (monthIncRate * i));
           annuityAmt = annuityCalc(currentMonthInt, monthsToPay);
           currentPayment = (loanAmt * annuityAmt);
           System.out.printf("%.2f10s", currentPayment);

      }

    }

    }


     }




public static double annuityCalc(double monthInt, double monthsToPay){
  double annuityFactor = 0;
  double mirPow = 0;
  mirPow = Math.pow((1+monthInt), monthsToPay);
  annuityFactor = ((monthInt*mirPow)/(mirPow-1));
  return annuityFactor;
}

}

它现在给我“java.util.UnknownFormatConversionException:Conversion ='1'”

编辑2: 我已将代码更改为

  for (double i = 0; i <= colNumberWithTop; i++) {
    //printing the top column
    if (i == 0){
     System.out.printf("%10", "Interest Rate");  
     for (double k = 0; k <= rowNumber; k++) {
         currentYears = (firstYears + (incYears * i));
         System.out.printf("%10", currentYears + " Years"); } 
    } else if (i > 0) {
      //finding annual interest rate for printing, and monthly interest rate as a decimal for math
      currentAnnInt = (startAnnInt + (incRate * i));
      currentMonthInt = ((currentAnnInt/100)/12);
      System.out.printf("%10.2f\n", currentAnnInt);
      for (double k = 0; k <= rowNumber; k++) {
           monthsToPay = (startMonthInt + (monthIncRate * i));
           annuityAmt = annuityCalc(currentMonthInt, monthsToPay);
           currentPayment = (loanAmt * annuityAmt);
           System.out.printf("%10.2f", currentPayment);

      }

我要回来的数据是

public static void paymentCalc(double startMonthInt, double endMonthInt, double monthIncRate, double firstMonths, double lastMonths, double incMonths, double loanAmt, double firstYears, double lastYears, double incYears, double startAnnInt, double endAnnInt, double incRate){
  double monthInt = 0;
  double monthsToPay = 0;
  double rowNumber = (((lastYears - firstYears))/incYears);
  double rowNumberWithInt = (rowNumber + 1);
  double colNumber = ((endMonthInt - startMonthInt)/monthIncRate);
  double colNumberWithTop = (colNumber+1);
  double currentYears = 0;
  double currentMonths = 0;
  double currentMonthInt = 0;
  double currentPayment = 0;
  double currentAnnInt = 0;
  double annuityAmt = 0;
 //counting columns
 for (double i = 0; i <= colNumberWithTop; i++) {
    //printing the top column
    if (i == 0){
     System.out.printf("%-20s", "Interest Rate");  
     for (double k = 0; k <= rowNumber; k++) {
         currentYears = (firstYears + (incYears * i));
         System.out.printf("%-20s", currentYears + " Years");
     }
     System.out.println(); 
    } else if (i > 0) {
      //finding annual interest rate for printing, and monthly interest rate as a decimal for math
      currentAnnInt = (startAnnInt + (incRate * i));
      currentMonthInt = ((currentAnnInt/100)/12);
      System.out.printf("%-20.2f%%", currentAnnInt*100);
      for (double k = 0; k <= rowNumber; k++) {
           monthsToPay = (firstMonths + (incMonths * i)); 
           annuityAmt = annuityCalc(currentMonthInt, monthsToPay);
           currentPayment = (loanAmt * annuityAmt);
           System.out.printf("%-20.2f", currentPayment);
      }
      System.out.println();

    }

    }


     }

为什么它这样做呢?它似乎是在30年专栏下打印利率并将所有其他列左移一个,并在顶部列的末尾打印第一个利率

预期输出

Interest Rate                 15.0 Years          15.0 Years          15.0 Years          15.0 Years
                4.25%         28235795.88         28235795.88         28235795.88         28235795.88
                4.50%         26667168.53         26667168.53         26667168.53         26667168.53
                4.75%         25263659.87         25263659.87         25263659.87         25263659.87
                5.00%         24000502.07         24000502.07         24000502.07         24000502.07
                5.25%         22857645.03         22857645.03         22857645.03         22857645.03
                5.50%         21818684.11         21818684.11         21818684.11         21818684.11
                5.75%         20870067.61         20870067.61         20870067.61         20870067.61
                6.00%         20000502.50         20000502.50         20000502.50         20000502.50
                6.25%         19200502.59         19200502.59         19200502.59         19200502.59
> 

2 个答案:

答案 0 :(得分:0)

PrintStream#printf接受格式字符串和对象,返回格式化字符串。格式字符串具有特定的数值格式:

  

%[argument_index$][flags][width][.precision]conversion

例如,要使一个数字占用15个字符并且有2个小数位,则以下格式字符串将执行以下操作: %15.2f

在编辑中,您缺少格式化字符串的转换部分。这导致了UnknownFormatConversionException。每个格式字符串必须以转换(d,f,b,s)结束。

例如,更改:

System.out.printf("%10", currentYears + " Years");

为:

System.out.printf("%10s", currentYears + " Years");

请注意格式字符串末尾的s。阅读official documentation.

中有关格式字符串语法的更多信息

答案 1 :(得分:0)

问题是,当我要求你移除你到处移除的那个... 这应该现在可以使用

- i want this from scratch
- i m new in mvc framewrok
- i m begineer in laravel
- i want custom login
根据OP的要求

已编辑