【问题标题】:Getting printed text to align properly使打印的文本正确对齐
【发布时间】:2017-09-24 02:35:13
【问题描述】:

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

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

}

编辑: 我将代码更改为

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

      }

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

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

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();

    }

    }


     }

我得到的数据是

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
> 

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

预期输出是

Interest Rate    15 Years   20 Years  25 Years  30 Years
4.0000           739.69     605.98    527.84    477.42
4.2500           752.28     619.23    541.74    491.94
4.5000           764.99     632.65    555.83    506.69
4.7500           777.83     646.22    570.12    521.65
5.0000           790.79     659.96    584.59    536.82
5.2500           803.88     673.84    599.25    552.20
5.5000           817.08     687.89    614.09    567.79
5.7500           830.41     702.08    629.11    583.57
6.0000           843.86     716.43    644.30    599.55

【问题讨论】:

  • "...打印一百万个小数..."?真的吗?有可能你的意思是 4 位小数而不是 2 位吗?
  • 如果您希望数字后跟s 字符,请保留s
  • 这似乎不起作用;我添加了一个带有更新的编辑
  • 你能给出整个堆栈跟踪吗?

标签: java printf


【解决方案1】:

问题是当我要求你删除你在所有地方删除的 s... 现在应该可以工作了

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");
     }
     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("%10.2f%%", currentAnnInt*100);
      for (double k = 0; k <= rowNumber; k++) {
           monthsToPay = (startMonthInt + (monthIncRate * i));
           annuityAmt = annuityCalc(currentMonthInt, monthsToPay);
           currentPayment = (loanAmt * annuityAmt);
           System.out.printf("%10.2f", currentPayment);
      }
      System.out.println();

已编辑根据 OP 的要求。

【讨论】:

  • 所以额外的 println();是否需要正确地将所有内容都放在正确的行上?
  • 是的,你之前有System.out.printf("%.2f10s\n", (currentAnnInt * 100)); \n 会在打印currentAnnInt 率后换行。那是行被打破的地方。 println 我放在两个地方,一个在标题之后,一个在打印完所有 5 年年金之后。
  • 数学仍然无法正常工作——例如,它在第一个单元格中给了我 28235795.88 而不是 739.69,但据我所知,我的数学是正确的哦,我明白了工作 - 感谢您的线路修复
  • 但是在您之前发布的输出中,它显示得很好!
  • 另外,如果我尝试左对齐所有内容,它会将 % 放在每个数字的开头(即,如果我将 %10.2f%% 更改为 %-10.2f%%)
【解决方案2】:

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.

上阅读有关格式字符串语法的更多信息

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-11
    • 1970-01-01
    • 1970-01-01
    • 2015-12-03
    • 2016-09-21
    • 1970-01-01
    • 2022-11-11
    • 1970-01-01
    相关资源
    最近更新 更多