2013-04-10 21 views
1

现在的问题是,如果你运行我的程序出来,我应该有一个字符串输出用户输入的月度投资,利率和年,它应该打印在一行和下一行,之后应该是相同但不同的价值,如果用户进入他想输入月度投资,利率和年份的另一个不同的值。我的箴言是它打印一切只是一个像前例如:$ 400 2.0%3 $ 500 3.0%2 < ---这从500美元开始应该在下一行不是第一个入口?线程main在调用println()之前停止?

System.out.print("Inv/Mo.\tRate\tYears\tFuture Value\n"); 
    for (int j = 0; j < FutureValueArrayList.size(); j++) 
    { 
     String myArrayList = FutureValueArrayList.get(j); 
     System.out.print(ArrayList + "\t"); 
     System.out.println(); 

    } 

我也得到这个错误,我似乎无法推测的方式来解决它“主线程停止前调用println()一样”,这是印刷(ArrayList的+“\ t”的)之后的println ;在我的循环。

import java.util.*; 
import java.text.*; 

public class FutureValueApp 
{ 
public static void main(String[] args) 
{ 
    // display a welcome message 
    System.out.println("Welcome to the Future Value Calculator"); 
    System.out.println(); 

    ArrayList<String> FutureValueArrayList = new ArrayList<String>(); 

    // perform 1 or more calculations 
    Scanner sc = new Scanner(System.in); 
    String choice = "y"; 
    while (choice.equalsIgnoreCase("y")) 
    { 

     // get the input from the user 
     System.out.println("DATA ENTRY"); 
     double monthlyInvestment = getDoubleWithinRange(sc, 
      "Enter monthly investment: ", 0, 1000); 
     double interestRate = getDoubleWithinRange(sc, 
      "Enter yearly interest rate: ", 0, 30); 
     int years = getIntWithinRange(sc, 
      "Enter number of years: ", 0, 100); 

     // calculate the future value 
     double monthlyInterestRate = interestRate/12/100; 
     int months = years * 12; 
     double futureValue = calculateFutureValue(
      monthlyInvestment, monthlyInterestRate, months); 

     // get the currency and percent formatters 
     NumberFormat currency = NumberFormat.getCurrencyInstance(); 
     NumberFormat percent = NumberFormat.getPercentInstance(); 
     percent.setMinimumFractionDigits(1); 

     // format the result as a single string 
     String results = 
       "Monthly investment:\t" 
        + currency.format(monthlyInvestment) + "\n" 
      + "Yearly interest rate:\t" 
        + percent.format(interestRate/100) + "\n" 
      + "Number of years:\t" 
        + years + "\n" 
      + "Future value:\t\t" 
        + currency.format(futureValue) + "\n"; 

     // print the results 
     System.out.println(); 
     System.out.println("FORMATTED RESULTS"); 
     System.out.println(results); 

     String monthlyInvestmentFormat = currency.format(monthlyInvestment); 
     String interestRateFormat = percent.format(interestRate/100); 
     String futureValueFormat = currency.format(futureValue); 

     FutureValueArrayList.add(monthlyInvestmentFormat); 
     FutureValueArrayList.add(interestRateFormat); 
     FutureValueArrayList.add(Integer.toString(years)); 
     FutureValueArrayList.add(futureValueFormat); 




     // see if the user wants to continue 
     System.out.print("Continue? (y/n): "); 
     choice = sc.next(); 

     System.out.println(); 
    } 

    System.out.print("Inv/Mo.\tRate\tYears\tFuture Value\n"); 
    for (int j = 0; j < FutureValueArrayList.size(); j++) 
    { 
     String ArrayList = FutureValueArrayList.get(j); 
     System.out.print(ArrayList + "\t"); 
     System.out.println(); 

    } 
    System.out.println(); 
} 

public static double getDouble(Scanner sc, String prompt) 
{ 
    boolean isValid = false; 
    double d = 0; 
    while (isValid == false) 
    { 
     System.out.print(prompt); 
     if (sc.hasNextDouble()) 
     { 
      d = sc.nextDouble(); 
      isValid = true; 
     } 
     else 
     { 
      System.out.println("Error! Invalid decimal value. Try again."); 
     } 
     sc.nextLine(); // discard any other data entered on the line 
    } 
    return d; 
} 

public static double getDoubleWithinRange(Scanner sc, String prompt, 
double min, double max) 
{ 
    double d = 0; 
    boolean isValid = false; 
    while (isValid == false) 
    { 
     d = getDouble(sc, prompt); 
     if (d <= min) 
      System.out.println(
       "Error! Number must be greater than " + min + "."); 
     else if (d >= max) 
      System.out.println(
       "Error! Number must be less than " + max + "."); 
     else 
      isValid = true; 
    } 
    return d; 
} 

public static int getInt(Scanner sc, String prompt) 
{ 
    boolean isValidInt = false; 
    int i = 0; 
    while (isValidInt == false) 
    { 
     System.out.print(prompt); 
     if (sc.hasNextInt()) 
     { 
      i = sc.nextInt(); 
      isValidInt = true; 
     } 
     else 
     { 
      System.out.println("Error! Invalid integer value. Try again."); 
     } 
     sc.nextLine(); // discard any other data entered on the line 
    } 
    return i; 
} 

public static int getIntWithinRange(Scanner sc, String prompt, 
int min, int max) 
{ 
    int i = 0; 
    boolean isValid = false; 
    while (isValid == false) 
    { 
     i = getInt(sc, prompt); 
     if (i <= min) 
      System.out.println(
       "Error! Number must be greater than " + min + "."); 
     else if (i >= max) 
      System.out.println(
       "Error! Number must be less than " + max + "."); 
     else 
      isValid = true; 
    } 
    return i; 
} 

public static double calculateFutureValue(double monthlyInvestment, 
double monthlyInterestRate, int months) 
{ 
    double futureValue = 0; 
    for (int i = 1; i <= months; i++) 
    { 
     futureValue = 
      (futureValue + monthlyInvestment) * 
      (1 + monthlyInterestRate); 
    } 
    return futureValue; 
} 
} 
+0

你有错误的堆栈跟踪? PS:在本地类之后命名变量确实是......非常混乱! – christopher 2013-04-10 19:20:06

+0

另外,作为编码清晰度约定,变量名的第一个字符应该是小写字母。命名一个字符串“ArrayList”是荒谬的混淆。 – Aurand 2013-04-10 19:21:13

+0

@nickecarlo它不会引发任何语法错误。刚刚尝试过。 – christopher 2013-04-10 19:21:48

回答

1

你需要像这样的代码

System.out.print("Inv/Mo.\tRate\tYears\tFuture Value\n"); 
for (int j = 0; j < FutureValueArrayList.size(); j++) 
{ 
    String ArrayList = FutureValueArrayList.get(j); 
    System.out.print(ArrayList + "\t"); 
    if((j+1)%4 == 0){ 
     System.out.println(); 
    } 

} 
System.out.println(); 

注意使用(J + 1)%4招。

注意:这只是一个格式化黑客。这样做的正确方法是创建一个带有4个参数(rate,sum,time,futureValue)的FutureValue对象,并重写toString()方法以正确打印所需格式的对象。 我鼓励你试试这个。

方法2:

/*FutureValueArrayList.add(monthlyInvestmentFormat); 
      FutureValueArrayList.add(interestRateFormat); 
      FutureValueArrayList.add(Integer.toString(years)); 
      FutureValueArrayList.add(futureValueFormat);*/ 

      FutureValueArrayList.add(monthlyInvestmentFormat+"\t"+interestRateFormat+"\t"+Integer.toString(years)+"\t"+futureValueFormat); 

现在有没有必要以任何方式更改您的打印代码。

+0

是否有另一种方式做它是类似于我的循环? – user2264244 2013-04-10 19:54:13

+0

我可以建议另一种方法。每条线有四个FutureValueArrayList.add()。而不是只有一个FutureValueArrayList.add(组合字符串)。将更新我的答案来证明这一点。 – prashant 2013-04-10 19:57:02

+0

非常感谢! – user2264244 2013-04-10 20:05:26

相关问题