我自己学习Java,并且已经开始使用接口。我正在使用Cay Horstmann编写的一本名为Big Java Early Objects的教科书。我遇到了一个很难理解的练习。练习指出:
System.out.printf方法具有用于打印整数,浮点数的预定义格式 数字和其他数据类型。但这也是可扩展的。如果您使用S格式, 可以打印实现Formattable接口的任何类。该界面有一个 单一方法:
void formatTo(Formatter formatter, int flags, int width, int precision)
在本练习中,您应该使BankAccount类实现Formattable接口。 忽略标志和精度,仅使用给定的宽度设置银行余额的格式即可。 为了完成此任务,您需要获得如下所示的附加参考:
Appendable a = formatter.out();
Appendable是带有方法的另一个接口
void append(CharSequence sequence)
CharSequence是由字符串(以及其他)实现的另一个接口 类。首先将银行余额转换为字符串,然后构造一个字符串 用空格填充它,使其具有所需的宽度。将该字符串传递给append方法。
我已经到达了一个点,在测试器类中,我创建了一个带有$ 1500美元的BankAccount对象的实例。致电System.out.printf("%s", account)
会给我1500。但是,我应该获得width参数来添加填充,但我不知道该如何进行。
此外,我拥有的代码对我来说没有意义。我按照练习的描述编写了代码,但我不知道它是如何工作的。
public class BankAccount implements Formattable
{
private String name;
private double balance;
/**
Constructs a bank account with a zero balance.
*/
public BankAccount()
{
this.name = "";
this.balance = 0;
}
/**
Constructs a bank account with a given balance.
@param initialBalance the initial balance
*/
public BankAccount(String name, double initialBalance)
{
this.name = name;
this.balance = initialBalance;
}
/**
Deposits money into the bank account.
@param amount the amount to deposit
*/
public void deposit(double amount)
{
balance = balance + amount;
}
/**
Withdraws money from the bank account.
@param amount the amount to withdraw
*/
public void withdraw(double amount)
{
balance = balance - amount;
}
/**
Gets the current balance of the bank account.
@return the current balance
*/
public double getBalance()
{
return balance;
}
public String getName()
{
return this.name;
}
public void formatTo(Formatter formatter, int flags, int width, int precision)
{
Appendable a = formatter.out();
String padding = "";
for(int i = 0; i < width; i++)
{
padding = padding.concat(" ");
}
String bankBalance = padding + String.valueOf(getBalance());
try
{
a.append(bankBalance);
}
catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
上面是我的BankAccount类,它实现Formattable并定义formatTo方法。我不了解Appendable a = formatter.out
的行为。以及对a.append(bankBalance)
的调用如何使我可以在测试人员课程中使用System.out.printf(%s, account);
。
下面是我的测试人员课程。
public class FormatTester
{
public static void main(String[] args)
{
BankAccount account = new BankAccount("Bob Robert", 1500);
System.out.printf("%s", account);
}
}
这将打印1500,而没有任何填充。我知道没有填充,因为width参数没有给出int值。我不知道如何设置它,因为如果我尝试这样做:
public class FormatTester
{
public static void main(String[] args)
{
BankAccount account = new BankAccount("Robert Bob", 1500);
Formatter formatter = new Formatter();
System.out.printf("%s", account.formatTo(formatter, 0, 5, 0);
}
}
它抱怨说
PrintStream类型的方法printf(String,Object ...)不是 适用于参数(字符串,无效)
如果无法以这种方式设置宽度,我该怎么做?顺便说一句,这个名字并不重要。我正尝试格式化名称,但暂时决定只保留余额。
答案 0 :(得分:0)
有一些解释...
Formatter fmt = new Formatter();
StockName sn = new StockName("HUGE", "Huge Fruit, Inc.",
"Fruit Titanesque, Inc.");
fmt.format("%s", sn); // -> "Huge Fruit, Inc."
fmt.format("%s", sn.toString()); // -> "HUGE - Huge Fruit, Inc."
fmt.format("%#s", sn); // -> "HUGE"
fmt.format("%-10.8s", sn); // -> "HUGE "
fmt.format("%.12s", sn); // -> "Huge Fruit,*"
fmt.format(Locale.FRANCE, "%25s", sn); // -> " Fruit Titanesque, Inc."
以及documentation上。