Использование формата S для печати класса, который реализует Formattable - PullRequest
0 голосов
/ 27 сентября 2018

Я изучаю Java самостоятельно и начал работать с интерфейсами.Я использую учебник под названием Big Java Early Objects от Cay Horstmann.Я наткнулся на упражнение, которое мне довольно трудно понять.В упражнении говорится:

Метод System.out.printf имеет предопределенные форматы для печати целых чисел, чисел с плавающей запятой и других типов данных.Но это также расширяемо.Если вы используете формат S, вы можете напечатать любой класс, который реализует интерфейс Formattable.Интерфейс имеет единственный метод:

    void formatTo(Formatter formatter, int flags, int width, int precision)

В этом упражнении класс BankAccount должен реализовывать интерфейс Formattable.Игнорируйте флаги и точность и просто форматируйте баланс банка, используя заданную ширину.Чтобы выполнить эту задачу, вам нужно получить ссылку на «Добавляемый», например:

    Appendable a = formatter.out();

Добавляемый - это еще один интерфейс с методом

    void append(CharSequence sequence)

CharSequence - еще один реализованный интерфейс(среди прочих) классом String.Создайте строку, сначала преобразовав баланс банка в строку, а затем добавив в нее пробелы, чтобы она имела желаемую ширину.Передайте эту строку в метод append.

Я дошел до того, что в классе тестера я создаю и экземпляр объекта BankAccount с 1500 долларов в нем.Вызов System.out.printf("%s", account) дает мне 1500. Однако я должен получить параметр ширины для добавления отступов, и я не знаю, как заставить это работать.

Кроме того, код, который у меня нет 'не имеет смысла для меня.Я написал код, следующий за описанием упражнения, но я не знаю, как он работает.

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

Он жалуется, говоря:

Метод printf (String, Object ...)в типе PrintStream не применяется для аргументов (String, void)

Если я не могу установить ширину таким образом, как я смогу это сделать?Кстати, имя не имеет значения.Я пытался отформатировать имя, но решил придерживаться только баланса.

1 Ответ

0 голосов
/ 17 января 2019

Есть объяснения ...

 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."

, а также в документации .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...