Java #17: Formatowanie łańcuchów znaków (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/

Stay in the Loop

Get the daily email from CryptoNews that makes reading the news actually enjoyable. Join our mailing list to stay in the loop to stay informed, for free.

Ostatnio dodane

- Advertisement - spot_img

Powiązane wpisy