How to use formatting correctly with printf in Java

I am trying to create a simple program to take three elements, their quantity and prices, and combine them together to create a simple receipt type format. My professor gave me a specific format for receiving, where all decimal places are lined up and sequentially placed. It should look like this.

Your Bill: Item Quantity Price Total Diet Soda 10 1.25 12.50 Candy 1 1.00 1.00 Cheese 2 2.00 4.00 Subtotal 17.50 6.25% Sales Tax 1.09 Total 18.59 

My professor pointed out that the name should be 30 characters, 10 - quantity, price and everything. For this I have to use the printf method. I am trying to format it using this code.

 import java.util.Scanner; class AssignmentOneTest { public static void main(String[] args) { Scanner kb = new Scanner(System.in); // System.out.printf("$%4.2f for each %s ", price, item); // System.out.printf("\nThe total is: $%4.2f ", total); // process for item one System.out.println("Please enter in your first item"); String item = kb.nextLine(); System.out.println("Please enter the quantity for this item"); int quantity = Integer.parseInt(kb.nextLine()); System.out.println("Please enter in the price of your item"); double price = Double.parseDouble(kb.nextLine()); // process for item two System.out.println("Please enter in your second item"); String item2 = kb.nextLine(); System.out.println("Please enter the quantity for this item"); int quantity2 = Integer.parseInt(kb.nextLine()); System.out.print("Please enter in the price of your item"); double price2 = Double.parseDouble(kb.nextLine()); double total2 = quantity2 * price2; // System.out.printf("$%4.2f for each %s ", price2, item2); // System.out.printf("\nThe total is: $%4.2f ", total2); // process for item three System.out.println("Please enter in your third item"); String item3 = kb.nextLine(); System.out.println("Please enter the quantity for this item"); int quantity3 = Integer.parseInt(kb.nextLine()); System.out.println("Please enter in the price of your item"); double price3 = Double.parseDouble(kb.nextLine()); double total3 = quantity3 * price3; // System.out.printf("$%4.2f for each %s ", price3, item3); // System.out.printf("\nThe total is: $%4.2f ", total3); double total = quantity * price; double grandTotal = total + total2 + total3; double salesTax = grandTotal * (.0625); double grandTotalTaxed = grandTotal + salesTax; String amount = "Quantity"; String amount1 = "Price"; String amount2 = "Total"; String taxSign = "%"; System.out.printf("\nYour bill: "); System.out.printf("\n\nItem"); System.out.printf("%30s", amount); // System.out.printf("\n%s %25d %16.2f %11.2f", item, quantity, price, // total); // System.out.printf("\n%s %25d %16.2f %11.2f", item2,quantity2, price2, // total2); // System.out.printf("\n%s %25d %16.2f %11.2f", item3,quantity3, price3, // total3); System.out.printf("\n%s", item); System.out.printf("%30d", quantity); System.out.printf("\n%s", item2); System.out.printf("\n%s", item3); System.out.printf("\n\n\nSubtotal %47.2f", grandTotal); System.out.printf("\n6.25 %s sales tax %39.2f", taxSign, salesTax); System.out.printf("\nTotal %50.2f", grandTotalTaxed); } } 

If I enter the longer name of the item, it moves the placement of quantity, price and total quantity. My question is how to create a starting point of a limited width set using printf, please help.

+7
source share
1 answer
 System.out.printf("%1$-30s %2$10d %3$10.2f %4$10.2f", "Diet Soda", 10, 1.25, 12.50); 

Print string

 Diet Soda 10 1.25 12.50 

The first line passed to the printf method is a series of format specifiers that describe how we want the remaining arguments to be printed.

The format specifiers above have the syntax %[index$][flags][width][.precision]conversion , where [] stands for optional.

% starts formatting.

[index]$ indicates the index of the argument you want to format. Indexes start at 1.

- The only flag used above aligns the output to the left.

[width] indicates the minimum number of characters to print.

.[precision] In this case, the number of digits to be written after the decimal point, although this depends on different conversions.

[conversion] character (s) indicating how the argument should be formatted. d for decimal integer, f - decimal format for floating points, s does not change the string in our case.

More information can be found here.

+11
source

All Articles