Как правильно использовать форматирование с printf в Java

Я пытаюсь создать простую программу, чтобы взять три элемента, их количество и цены и объединить их вместе, чтобы создать простой формат типа квитанции. Мой профессор дал мне конкретный формат для получения, где все десятичные знаки выстраиваются в линию и последовательно помещаются. Это должно выглядеть так.

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

Мой профессор указал, что имя должно быть 30 символов, 10 - количество, цена и всего. Для этого я должен использовать метод printf. Я пытаюсь отформатировать его с помощью этого кода.

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");
 ****** price = ******.parse******(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");
 ****** price2 = ******.parse******(kb.nextLine());
 ****** 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");
 ****** price3 = ******.parse******(kb.nextLine());
 ****** total3 = quantity3 * price3;
 // System.out.printf("$%4.2f for each %s ", price3, item3);
 // System.out.printf("\nThe total is: $%4.2f ", total3);
 ****** total = quantity * price;
 ****** grandTotal = total + total2 + total3;
 ****** salesTax = grandTotal * (.0625);
 ****** 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); 
 }
}

Если я вхожу в более длинное имя элемента, он перемещает размещение количества, цены и общего количества. Мой вопрос заключается в том, как создать начальную точку набора с ограниченной шириной с помощью printf, пожалуйста, помогите.

1 ответ

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

Выведет строку

Diet Soda 10 1.25 12.50

Первая строка, переданная методу printf, представляет собой серию спецификаторов формата, которые описывают, как мы хотим, чтобы остальные аргументы были напечатаны.

Спецификаторы формата выше имеют синтаксис %[index$][flags][width][.precision]conversion, где [] обозначает необязательный.

% начинает форматирование.

[index]$ указывает индекс аргумента, который вы хотите отформатировать. Индексы начинаются с 1.

- Единственный флаг, используемый выше, выравнивает вывод влево.

[width] указывает минимальное количество печатаемых символов.

.[precision] В этом случае количество цифр, которые должны быть записаны после десятичной точки, хотя это зависит от разных преобразований.

[conversion] символ (ы), указывающий, как аргумент должен быть отформатирован. d для десятичного целого, f - десятичный формат для плавающих точек, s не изменяет строку в нашем случае.

Более подробную информацию можно найти здесь.

licensed under cc by-sa 3.0 with attribution.