Site icon Java blog

Java #17: Formatowanie łańcuchów znaków (String format)

java string format

Formatowanie łańcuchów znaków

Na pewno kilka razy zastanawiałeś się, dlaczego nie można w prosty sposób formatować Stringi. Okazuje się, że w formatowanie łańcuchów znakó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);
    }
}

Metoda format

Zasada tworzenia sformatowanego 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));
    }
}

Czasami możesz znaleźć formatowanie łańcuchów znaków, używając specyfikatora formatu pisanego wielką literą (np. zamiast %s, będzie %S). Różnica między między pierwotnym podejściem, a tym, które opisałem w poprzednim zdaniu, polega na tym, że Twój tekst będzie przeformatowany na wielkie litery.

Czyli zapis: String.format(„%S”, „Hi James!”); jest równoważny z: String.format(„%s”, „Hi James!”).toUpperCase();

Tabelka ułatwiająca formatowanie łańcuchów znaków:

Specyfikator formatuTyp danych wejściowychWynik
%skażdyłańcuch znaków (String)
%ftyp zmiennoprzecinkowy (float)liczba ułamkowa w notacji dziesiętnej
%ctyp znakowy (char)typ znakowy zgodny z kodowaniem Unicode
%dtypy całkowite (incl. byte, short, int, long, bigint)liczba całkowita w notacji dziesiętnej

Formatowanie łańcuchów znaków można alternatywnie wykonać za pomocą klasy StringUtils z zewnętrznej biblioteki commons-lang*.

* https://commons.apache.org/proper/commons-lang/

Link do lekcji: https://github.com/developeronthego/java-basics/tree/main/src/main/java/basics/lesson17

Lekcja o klasie Stringhttps://developeronthego.pl/java-podstawy-8-string-stringbuilder-stringbuffer/

Exit mobile version