2013-07-14 7 views
2

Как написать метод toString(), который печатает имя и computePay с двумя десятичными знаками для трех сотрудников? Программа работала (имя печати и weekPay в командной строке), прежде чем добавить StringBuilder. Любая помощь приветствуется.Как написать метод toString()

import javax.swing.JOptionPane; 

public class TestPayroll { 

     public static void main(String[] args) { 

       Payroll employee1 = new Payroll("Tiny Tim", 100.25, 40); 
       Payroll employee2 = new Payroll("Brad Pitt", 150.50, 10); 
       Payroll employee3 = new Payroll("Madonna", 124.24, 20); 

     StringBuilder sb = new StringBuilder(); 

     String toDisplay=sb.toString();   
     sb.append(String.format("\n", employee1.getName(), employee1.getComputePay())); 
     sb.append(String.format("\n", employee2.getName(), employee2.getComputePay())); 


     JOptionPane.showMessageDialog(null, sb.toString(), toDisplay, JOptionPane.INFORMATION_MESSAGE); 
     }      
} 

public class Payroll { 

    public static void main(String[] args) { 
       } 

       private String name; 
       private double payRate; 
       private double hrsWorked; 
       private double computePay; 

       //default constructor 
       public Payroll() { 
         this.name = name; 
         this.payRate = payRate; 
         this.hrsWorked = hrsWorked; 
         this.computePay = computePay; 
       } 

       //Payroll constructor 
       public Payroll(String name, double payRate, double hrsWorked) { 
         this.name = name; 
         this.payRate = payRate; 
         this.hrsWorked = hrsWorked; 
       } 

       //return name 
       public String getName() { 
         return name; 
       } 

       //set name 
       public void setName(String name) { 
         this.name = name; 
       } 

       //return pay rate 
       public double getPayRate() { 
         return payRate; 
       } 

       //set pay rate 
       public void setPayRate(double payRate) { 
         this.payRate = payRate; 
       } 

       //return hours worked for the week 
       public double getHrsWorked() { 
         return hrsWorked; 
       } 

       //set hours worked for the week 
       public void setHrsWorked(double hrsWorked) { 
         this.hrsWorked = hrsWorked; 
       } 

       //find week's pay 
       public double getComputePay() { 
         double computePay = payRate * hrsWorked; 
      return computePay; 
       }  

} 
+1

* с двумя десятичными знаками для трех сотрудников? * Я не понимаю эту строку, вы можете объяснить больше! – Azad

+0

Ваш класс TestPayroll даже не будет компилироваться. Исправьте '}' для основного метода – Multithreader

+0

Извините. Есть 3 сотрудника, и я хочу показать их имена и недели. weeksPay должно быть с двумя знаками после запятой. – Grafica

ответ

1

Для форматов десятичных чисел, вы можете использовать java.text.DecimalFormat, определить его на уровне класса, как class member так, чтобы она могла разделить его поведения для всех объектов Payroll, как @Multithreader упомянул его в комментариях, это будет ваш toString() метод:

private static DecimalFormat df = new DecimalFormat("#.##"); 
//...... 
    @Override 
    public String toString(){ 
     return "Name: "+getName()+ 
      "\nCompute Pay: "+df.format(getComputePay())+"\n"; 
    } 

Вызвать метод, как это:

System.out.println(employee1.toString()); 

Я предпочитаю использовать java.util.List, как это уменьшить много кодов:

public static void main(String[] args) { 
    List <Payroll> employes = new ArrayList<>(); 

    employes.add(new Payroll("Tiny Tim", 100.2534, 40.87876)); 
    employes.add(new Payroll("Brad Pitt", 150.50, 10)); 
    employes.add(new Payroll("Madonna", 124.24, 20)); 

    for(Payroll p :employes){ 
    System.out.println(p.toString()+"\n"); 
    } 
} 
+0

Ничего себе. Спасибо. – Grafica

+0

@Grafica: см. Также обновленный ответ. – Azad

+1

Было бы еще лучше, если бы вы сохранили 'new java.text.DecimalFormat (« #. ## »)' как конечную статическую приватную переменную в том же классе или где-то еще вместо создания объекта 'new' каждый раз вы вызываете 'toString()' – Multithreader

0

Это может помочь

@Override 
    public String toString(){ 
     Formatter fmt = new Formatter(); 
     fmt.format("%.2f", computePay); 
     return "Name : "+name+"\n"+"ComputePay : "+fmt.toString(); 
    } 

Конечно, вам нужно импортировать java.util.Formatter.

0

Я думаю, что следующий код должен дать компиляции ошибки времени:

//default constructor 
       public Payroll() { 
         this.name = name; 
         this.payRate = payRate; 
         this.hrsWorked = hrsWorked; 
         this.computePay = computePay; 
       } 

и этот кусок кода дает вам неприятности:

sb.append(String.format("\n", employee1.getName(), employee1.getComputePay())); 
sb.append(String.format("\n", employee2.getName(), employee2.getComputePay())); 

Вы должны иметь этот код вместо предыдущего :

sb.append(String.format("%s,%f\n",employee1.getName(), employee1.getComputePay())); 
sb.append(String.format("%s,%f\n",employee2.getName(), employee2.getComputePay())); 

Ваш Payroll Класс должен выглядеть следующим образом:

public class Payroll { 

    private String name; 
    private double payRate; 
    private double hrsWorked; 
    private double computePay;//need not to be instance variable 

    //default constructor 
    public Payroll() { 
     //should set default value if you want 
    } 

    //Payroll constructor 
    public Payroll(String name, double payRate, double hrsWorked) { 
     this.name = name; 
     this.payRate = payRate; 
     this.hrsWorked = hrsWorked; 
    } 

    //return name 
    public String getName() { 
     return name; 
    } 

    //set name 
    public void setName(String name) { 
     this.name = name; 
    } 

    //return pay rate 
    public double getPayRate() { 
     return payRate; 
    } 

    //set pay rate 
    public void setPayRate(double payRate) { 
     this.payRate = payRate; 
    } 

    //return hours worked for the week 
    public double getHrsWorked() { 
     return hrsWorked; 
    } 

    //set hours worked for the week 
    public void setHrsWorked(double hrsWorked) { 
     this.hrsWorked = hrsWorked; 
    } 

    //find week's pay 
    public double getComputePay() { 
     double computePay = payRate * hrsWorked; 
     return computePay; 
    }  


} 
import javax.swing.JOptionPane; 

public class TestPayroll { 

     public static void main(String[] args) { 

       Payroll employee1 = new Payroll("Tiny Tim", 100.25, 40); 
       Payroll employee2 = new Payroll("Brad Pitt", 150.50, 10); 
       Payroll employee3 = new Payroll("Madonna", 124.24, 20); 

     StringBuilder sb = new StringBuilder(); 

     String toDisplay=sb.toString(); 
     sb.append(String.format("%s,%f\n",employee1.getName(), employee1.getComputePay())); 
     sb.append(String.format("%s,%f\n",employee2.getName(), employee2.getComputePay())); 
     // sb.append(String.format("\n", employee1.getName(), employee1.getComputePay())); 
     //sb.append(String.format("\n", employee2.getName(), employee2.getComputePay())); 


     JOptionPane.showMessageDialog(null, sb.toString(), toDisplay, JOptionPane.INFORMATION_MESSAGE); 
     }      
} 
1

Вы можете использовать класс Apache ToStringBuilder. Вот пример из документации:

public class Person { 
    String name; 
    int age; 
    boolean smoker; 

    ... 

    public String toString() { 
    return new ToStringBuilder(this). 
     append("name", name). 
     append("age", age). 
     append("smoker", smoker). 
     toString(); 
    } 
} 
Смежные вопросы