使用Java中的printf完美格式化 [英] Formatting perfectly with printf in Java

查看:92
本文介绍了使用Java中的printf完美格式化的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试让我的程序打印出三个项目的清单,其中包含名称数量和价格。一切正常,我需要的是如何合成价格和总数,以便每次都能排列所有小数,无论数字有多大。这是我的代码

I'm trying to make my program print out a bill of three items with their names quantities and prices. Everything works fine, all I need is how to formate the prices and totals in order to make all the decimals line up everytime, no matter how big the number. Here's my 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("%28s %11s %11s", "Quantity", "Price", "Total");

    //complete item one format
    System.out.printf("\n%-30s", item);
    System.out.printf("%-10d", (int)quantity);
    System.out.printf("%-10.2f", (float)price);
    System.out.printf("  " + "%-10.2f", (float)total);

    //complete item two format
    System.out.printf("\n%-30s", item2);
    System.out.printf("%-10d", (int)quantity2);
    System.out.printf("%-10.2f", (float)price2);
    System.out.printf("  " + "%-10.2f", (float)total2);

    //complete item three format
    System.out.printf("\n%-30s", item3);
    System.out.printf("%-10d", (int)quantity3);
    System.out.printf("%-10.2f", (float)price3);
    System.out.printf("  " + "%-10.2f", (float)total3);




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



}

问题在于每次价格相同,一切都排好,但我们可以说我输入了50.00的价格和两个不同商品的价格为2.50,那么商品价格和小数点总数并不排列,请帮忙。

The problem is that every time the prices are the same, everything lines up, but lets say I type in a price of 50.00 and a price of 2.50 for two different items, then the items price and total decimal points don't all line up, please help.

推荐答案

我发现,如果我在一对匹配的函数中输出,那么排列标题和列会容易得多对于标题和一个数据,例如:

I find that lining up titles and columns is a lot easier if I do the output in a matched pair of functions, one for the titles and one for the data, e.g.:

public static void prLine (String item, int quantity, double price, double total) {
    System.out.printf("\n%-20.20s %10d %10.2f %10.2f", item, quantity, 
            price, total);
}   

public static void prTitles () {
    System.out.printf("\n%-20s %10s %10s %10s", "Item", "Quantity", 
            "Price", "Total");
}

你可以看到很容易让字段宽度很好地对应这个办法。然后我可以使用以下函数:

You can see that it is easy to get the field widths to correspond nicely this way. Then I can use these functions as follows:

prTitles ();
prLine (item,quantity,price,total);
prLine (item2,quantity2,price2,total2);
prLine (item3,quantity3,price3,total3);

...我得到了我认为你正在寻找的风格的排队输出:

... and I get lined-up output in the style I think you're looking for:

Your bill:
Item                   Quantity      Price      Total
first                         1       1.50       1.50
second                       10      12.50     125.00 
third                       456     322.00  146832.00

将输出代码放入函数中也大大减少了 main()函数中的代码行。

Putting the output code in functions also greatly reduces the number of lines of code in the main() function.

这篇关于使用Java中的printf完美格式化的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆