【问题标题】:How to use formatting with printf correctly in Java如何在 Java 中正确使用 printf 格式化
【发布时间】:2013-01-19 09:41:51
【问题描述】:

我正在尝试创建一个简单的程序来接收三个项目、它们的数量和价格,并将它们加在一起以创建一个简单的收据类型格式。我的教授给了我一个特定的收据格式,其中所有小数都排成一列并始终如一地放置。它应该是这样的。

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 设置一个有限宽度的起点,请帮忙。

【问题讨论】:

标签: java 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 开始。实际上不需要上面的索引,因为每个没有索引的格式说明符都被分配了一个从 1 开始计数的值。

[-] 上面使用的唯一标志,将输出向左对齐。

[width] 表示要打印的最小字符数。

[.precision]在这种情况下是小数点后要写入的位数,尽管这会随着不同的转换而变化。

conversion 字符表示参数的格式。 d 是十进制整数,f 是浮点十进制格式,s 在我们的例子中不会改变字符串。

更多信息可以找到here.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 2014-11-08
    • 1970-01-01
    • 1970-01-01
    • 2015-02-10
    • 1970-01-01
    • 2012-02-14
    相关资源
    最近更新 更多