Java 在toString()方法中格式化双精度值(相对于十进制)

Java 在toString()方法中格式化双精度值(相对于十进制),java,string,formatting,format,double,Java,String,Formatting,Format,Double,这是一个相当简单的问题。我有一个对象类Item,它构造了TestItem类中声明的对象。重写的toString()方法使用DecimalFormat类来格式化我的双值price。当我的toString()方法以这种方式编写时,我的输出是以这种方式生成的: 我唯一希望的格式修改是与十进制对齐,我如何实现这一点 public String toString() { DecimalFormat format = new DecimalFormat("##.00");

这是一个相当简单的问题。我有一个对象类
Item
,它构造了
TestItem
类中声明的对象。重写的
toString()
方法使用
DecimalFormat
类来格式化我的双值
price
。当我的
toString()
方法以这种方式编写时,我的输出是以这种方式生成的:

我唯一希望的格式修改是与十进制对齐,我如何实现这一点

     public String toString() {
        DecimalFormat format = new DecimalFormat("##.00");
        String add = "";
        if(itemName.length() < 7) {
            add = "\t";
        }
        return itemID + " \t " + itemName + add + "\t" + inStore  + "\t   $" + format.format(price);
    }

public class TestItem {
    public static void main(String [] args) {
        Item list[] = { new Item(1011, "Air Filters", 200, 10.5),
                        new Item(1034, "Door Knobs", 60, 21.5),
                        new Item(1101, "Hammers", 90, 9.99),
                        new Item(1600, "Levels", 60, 19.99),
                        new Item(1500, "Ceiling Fans", 100, 59),
                        new Item(1201, "Wrench Sets", 55, 80) };
        printMovies(list);
    }

    public static void printMovies(Item list[]) {
        System.out.println("itemID\t itemName\tinStore\t    price");
        System.out.println("------------------------------------------");
        for(Item token : list) {
            System.out.println(token);
        }
        System.out.println();
    }
}
公共字符串toString(){
DecimalFormat=新的DecimalFormat(“##.00”);
字符串add=“”;
if(itemName.length()<7){
添加=“\t”;
}
返回itemID+“\t”+itemName+add+“\t”+inStore+“\t$”+format.format(价格);
}
公开课测验{
公共静态void main(字符串[]args){
项目清单[]={新项目(1011,“空气过滤器”,200,10.5),
新项目(1034,“门把手”,60,21.5),
新项目(1101,“锤子”,90,9.99),
新项目(1600,“等级”,60,19.99),
新项目(1500“吊扇”、100、59、,
新项目(1201,“扳手组”,55、80)};
印刷电影(列表);
}
公共静态无效打印电影(项目列表[]){
System.out.println(“itemID\t itemName\t商店\t价格”);
System.out.println(“------------------------------------------------”);
用于(项目标记:列表){
System.out.println(令牌);
}
System.out.println();
}
}

这不是完整的代码;只有相关的部分。

我会使用
00.00
作为模式,然后你会得到一个像09.53这样的字符串

然后你看,如果第一个和第二个字符是“0”,如果是,用空格替换它们。您应该使用一个新的字符串对象来处理这个问题,因为您不能更改字符串的字符。

您可以使用
string.format
来控制一般的格式。不幸的是,我看不到任何直接将其与自定义模式相结合的方法,但您可以组合它们。例如:

import java.math.*;
import java.text.*;

public class Test {
    public static void main(String[] args) {
        showPrice(new BigDecimal("123.456"));
        showPrice(new BigDecimal("11.12"));
        showPrice(new BigDecimal("10.5"));
        showPrice(new BigDecimal("1.5"));
        showPrice(new BigDecimal("0.5"));
    }

    static void showPrice(BigDecimal price) {
        DecimalFormat format = new DecimalFormat("0.00");
        String text = String.format("Price: $%5s", format.format(price));
        System.out.println(text);
    }
}
输出:

Price: $123.46
Price: $11.12
Price: $10.50
Price: $ 1.50
Price: $ 0.50
请注意:

  • $
    符号仍然对齐(空格在后面)
  • “宽”的价格看起来不太好,但你对此无能为力
  • 使用
    “0.00”
    而不是
    “#####
    表示最后的价格是“0.50”而不是“.5”

您可以使用
String.format
对所有数据进行格式化,用格式说明符控制字段的宽度。您可能希望使用空格而不是制表符来更容易地确保对齐。

第一个问题:对货币值使用
double
BigDecimal
更合适。哪个版本您正在使用的Java版本?
String.format
可能会使这一切变得更简单。@JonSkeet不确定,我如何检查我使用的是什么版本?我不知道BlueJ内部的情况,但我希望在环境设置中很容易找到它…@JonSkeet不知道;您知道我可以如何执行所需的任务吗?您知道吗你可以试试我给你的代码……如果它对你有效,我们就开始吧。
不会产生前导0。我想你是说
00.00
作为模式。