0

I'm taking Elementary Programming and I'm trying to get this code to work, and I can only use the first 3 chapters worth of the Java Foundations book, and the book is very complicated and unclear on this part. I can't even tell you if I'm approaching this the right way, but I've been working on it for over a week now and just can't get it.

This is supposed to let the user input the houses cost, tax rate over 5 years, and fuel rate over 5 years for 3 houses, then print them in a side by side table across 4 lines.

    import java.util.Scanner;
    import java.text.NumberFormat;
    import java.text.DecimalFormat;
    
    
    
    public class houseCost {
    

    public static void main(String[] args) 
        
    
        

    {
        
        
    
    double costHouse1, costHouse2, costHouse3, fuelHouse1, fuelHouse2, fuelHouse3, finalHouse1, finalHouse2, finalHouse3, finalFuel1, finalFuel2, finalFuel3, finalTax1, finalTax2, finalTax3, taxHouse1, taxHouse2, taxHouse3;
    
    {
    Scanner scan = new Scanner(System.in);
    
    NumberFormat fmt1, fmt2, fmt3 = NumberFormat.getCurrencyInstance();
    
    
    
    
    System.out.print("Enter the value of the first house:");
    costHouse1 = scan.nextDouble();
    
    System.out.print("Enter the fuel cost for the first house:");
    fuelHouse1 = scan.nextDouble();
    
    System.out.print("Enter the tax rate of the first house:");
    taxHouse1 = scan.nextDouble();
    
    System.out.print("Enter the value of the second house:");
    costHouse2 = scan.nextDouble();
    
    System.out.print("Enter the fuel cost of the second house:");
    fuelHouse2 = scan.nextDouble();
    
    System.out.print("Enter the tax rate of the second house:");
    taxHouse2 = scan.nextDouble();
    
    System.out.print("Enter the value of the third house:");
    costHouse3 = scan.nextDouble();
    
    System.out.print("Enter the fuel cost of the third house:");
    fuelHouse3 = scan.nextDouble();
    
    System.out.print("Enter the tax rate of the third house:");
    taxHouse3 = scan.nextDouble();
    
    finalTax1 = ((costHouse1 * taxHouse1) * 5);
    finalTax2 = ((costHouse2 * taxHouse2) * 5);
    finalTax3 = ((costHouse3 * taxHouse3) * 5);
    
    finalFuel1 = (fuelHouse1 * 5);
    finalFuel2 = (fuelHouse2 * 5);
    finalFuel3 = (fuelHouse3 * 5);
    
    
    finalHouse1 = costHouse1 + finalTax1 + finalFuel1;
    finalHouse2 = costHouse2 + finalTax2 + finalFuel2;
    finalHouse3 = costHouse3 + finalTax3 + finalFuel3;
    
    
    
        
    
    System.out.printf("Initial House Cost\tAnnual Fuel Cost\tTaxes\t\tTotal Cost\n");
    System.out.printf("\t%5d\t\t\t%5d\t\t%5d\t\t%5d\n", costHouse1, finalFuel1, finalTax1, finalHouse1);
    System.out.printf("\t%5d\t\t\t%5d\t\t%5d\t\t%5d\n", costHouse2, finalFuel2, finalTax2, finalHouse2);
    System.out.printf("\t%5d\t\t\t%5d\t\t%5d\t\t%5d\n", costHouse3, finalFuel3, finalTax3, finalHouse3);
    
    
    
            
}}}

If I run the program as is (or using DecimalFormat as opposed to NumberFormat), I can enter all the numbers and as soon as the 9th is entered, I get

"Exception in thread "main" java.util.IllegalFormatConversionException: d != java.lang.Double at java.base/java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4442) at java.base/java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2963) at java.base/java.util.Formatter$FormatSpecifier.print(Formatter.java:2918) at java.base/java.util.Formatter.format(Formatter.java:2689) at java.base/java.io.PrintStream.format(PrintStream.java:1209) at java.base/java.io.PrintStream.printf(PrintStream.java:1105) at houseCost.main(houseCost.java:74)"

What I have read up on is that the NumberFormat and DecimalFormat are not variables to store data, but how to format it. I MUST use one or both of these in the project. I also have to format the output to look like a table which I think I did right with the printf.

I keep getting differing errors seen below. Where the variable initialization comes in is if I switch the bottom lines of code to something like this:

"

System.out.printf("\t%5d\t\t\t%5d\t\t%5d\t\t%5d\n", costHouse1, finalFuel1, finalTax1, fmt1.format(finalHouse1));

"

So, the ultimate question is, how do I resolve the error and take all the inputted numbers, put them through their calculations, and output them in ("0.##") format? Am I close? Have I really bothced this?

Thanks for your help!

King Bane
  • 31
  • 2
  • See https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-using-next-or-nextfoo, but in short you must call `scanner.nextLine()` after reading the input to clear the newline from the input buffer. IMHO you're always better to read the whole line using nextLine() and parse it for the value you want. – Bohemian Jan 28 '23 at 22:53
  • Fixing your indents and extra blank lines will make programming easier. – Basil Bourque Jan 29 '23 at 00:26

2 Answers2

1

To format the values in your output, using NumberFormat class. Here's how to do it with your current code:

NumberFormat fmt = NumberFormat.getCurrencyInstance();

To display the formatted currency values in your output, you can use the printf method and include the %s placeholder in your format string, then pass the formatted currency values using the fmt.format() method.

System.out.printf("\t%s\t\t\t%s\t\t%s\t\t%s\n",
                    fmt.format(costHouse1),
                    fmt.format(finalFuel1),
                    fmt.format(finalTax1),
                    fmt.format(finalHouse1));

Regarding the issue with your current code, you are using the %d placeholder for the printf method, which is used for integers. Since your variables are of type double, you should use the %f placeholder instead.

System.out.printf("\t%5f\t\t\t%5f\t\t%5f\t\t%5f\n",
                        costHouse1,
                        finalFuel1,
                        finalTax1,
                        finalHouse1);
Mohamed Darwesh
  • 659
  • 4
  • 17
0

Since you're using double variables, you have to ensure the correct string format in printf(). We generally use %d od %i to represent integer values, and we use %f (f as in floating point) to represent floating point values.