10

3 つのアイテム、その数量、および価格を取り込み、それらをすべて加算して単純な領収書タイプのフォーマットを作成する簡単なプログラムを作成しようとしています。私の教授は、すべての小数が一列に並び、一貫して配置される領収書の特定の形式を教えてくれました。このように見えるはずです。

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

長い商品名を入力すると、数量と価格と合計の配置がずれます。私の質問は、printf を使用して幅が制限された開始点を設定するにはどうすればよいですか、助けてください。

4

1 に答える 1

21
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 から始まります。インデックスのない各フォーマット指定子には 1 からカウントアップするものが割り当てられるため、上記のインデックスは実際には必要ありません。

[-]上記で使用される唯一のフラグは、出力を左揃えにします。

[width]印刷する最小文字数を示します。

[.precision]この場合、小数点の後に書き込まれる桁数ですが、これは変換によって異なります。

conversion引数のフォーマット方法を示す文字。dは 10 進整数用、fは浮動小数点の 10 進形式s、この場合は文字列を変更しません。

詳細については、こちらを参照してください。

于 2014-06-14T01:31:21.530 に答える