Nauka programowania Java #17: Formatowanie tekstu

Na pewno kilka razy zastanawiałeś się, dlaczego nie można w prosty sposób formatować łańcuchy znaków. Okazuje się, że w Javie jest to bardzo proste. Poniżej zaimplementowałem pomocniczą klasę Cat, przechowującą model danych ( w tym przypadku są to ‘właściwości’ kota).

public class Cat {
    private String name;
    private String race;
    private int age;
    private double value;
    private char sex;

    public Cat(String name, String race, int age, double value, char sex) {
      this.name = name;
      this.race = race;
      this.age = age;
      this.value = value;
      this.sex = sex;
    }

    public String getName() {
      return name;
    }

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

    public String getRace() {
      return race;
    }

    public void setRace(String race) {
      this.race = race;
    }

    public int getAge() {
      return age;
    }

    public void setAge(int age) {
      this.age = age;
    }

    public double getValue() {
      return value;
    }

    public void setValue(double value) {
      this.value = value;
    }

    public char getSex() {
      return sex;
    }

    public void setSex(char sex) {
      this.sex = sex;
    }

}
public class StringFormatSample {

    public static void main(String[] args) {
      Cat cat = new Cat("Emma", "Persian", 10, 100.5, 'F');

      String sampleText = String.format("The name of my cat is %s and it race is %s. It sex is %c and it is %d years old. \nI bought him for the price %f", cat.getName(), cat.getRace(), cat.getSex(), cat.getAge(), cat.getValue());
      System.out.println(sampleText);
    }
}

Zasada tworzenia zformatowanego tekstu jest prosta. Używasz statycznej metody z klasy String o nazwie ‘format’. W nawiasie wpisujesz jakiś napis, który zawiera specjalne aliasy, symbolizujące  rodzaj danych, które chcesz wyświetlisz. Dane te w postaci zmiennych (typu String, int, double, itp.) wypisujesz po przecinku. Jest to o tyle pożyteczne, że jeśli się pomylisz i chciałbyś zawsze wyświetlać liczbę całkowitą (np. w przypadku wieku), a w obiekcie Cat pod zmienną age będzie coś innego, to czeka Cię taki komunikat na konsoli:

Exception in thread "main" java.util.IllegalFormatConversionException: d != java.lang.Double
  at java.util.Formatter$FormatSpecifier.failConversion(Formatter.java:4302)
  at java.util.Formatter$FormatSpecifier.printInteger(Formatter.java:2793)
  at java.util.Formatter$FormatSpecifier.print(Formatter.java:2747)
  at java.util.Formatter.format(Formatter.java:2520)
  at java.util.Formatter.format(Formatter.java:2455)
  at java.lang.String.format(String.java:2940)
  at basics.lesson17.StringFormatSample.main(StringFormatSample.java:8)

 

W następnej klasie piszę metodę main, aby przetestować mój formater. Tworzę obiekt klasy Cat, wypełniając go przykładowymi danymi oraz formatuję tekst za pomocą metody String.format.

public class DateFormatSample {

    public static void main(String[] args) {
      Calendar birthDay = new GregorianCalendar(1988, 7, 1);
      String sampleFormatString = String.format("My birthday: %1$td - %1$tm - %1$tY", birthDay);
      System.out.println(sampleFormatString );

      SimpleDateFormat dateFormatter = new SimpleDateFormat("E, y-M-d 'at' h:m:s a z");
      Date now = new Date();
      System.out.println("Format:   " + dateFormatter.format(now));
    }
}

 

Dodaj komentarz