String z własnym formatem dostarczanie wartości

0

Cześć, mam obiekt i gotowe powiadomienia na temat tego obiektu ala np:
String wzor = "${trip_distance} odleglosc do ${trip_destination}";
jakiś prosty format odnośnie wartości, będę je brać z obiektu (getterami) i dostarczać.

zwracam się z pytaniem czy istnieje gotowa lekka biblioteka do tego / mechanizm w javie?

niżej zamieszczam najprostszy przykładowy kod o co mi chodzi.
uprzedzając - wiem co robię i to nie jest potrzebne mi do widoku ani nic takiego.

import com.google.common.collect.ImmutableMap;

import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Main {

    public static String fmtToString(String formattedStr, Trip trip) {
        final Map<String, String> map = ImmutableMap.of(
                "trip_destination", trip.getDestination(),
                "trip_distance", trip.getDistance().toString()
        );
        Pattern p = Pattern.compile("\\$\\{(.*?)\\}");
        Matcher m = p.matcher(formattedStr);
        StringBuffer sb = new StringBuffer();
        while (m.find()) {
            m.appendReplacement(sb, map.get(m.group(1)));
        }
        m.appendTail(sb);
        return sb.toString();
    }

    public static void main(String[] args) {
        final String niezmiennyWzor = "${trip_distance} odleglosc do ${trip_destination}";
        final String niezmiennyWzor2 = "wycieczka wycieczka ${trip_destination} super ${trip_destination}";
        //itd ....
        Trip trip = new Trip("California", 18342);

        System.out.println(fmtToString(niezmiennyWzor, trip));
        //wypisze: 18342 odleglosc do California
        System.out.println(fmtToString(niezmiennyWzor2, trip));
        //wypisze: wycieczka wycieczka California super California
    }

}

class Trip {
    private String destination;
    private Integer distance;

    public Trip(String destination, Integer distance) {
        this.destination = destination;
        this.distance = distance;
    }

    public String getDestination() {
        return destination;
    }

    public Integer getDistance() {
        return distance;
    }
}
1

A nie możesz po ludzku użyć MessageFormat.format?

System.out.println(MessageFormat.format("{0} + {1} = {2}", x, y, x + y));

http://docs.oracle.com/javase[...]/java/text/MessageFormat.html

0

@Koziołek a da się zamiast kluczy typu{0} stosować stringowe np. {user.name} ?

0

Nope, ale wtedy to co pisze @Tgc oczywicie o ile nie potrzebujesz rozwiązywać nazw pól z klas.

0

a spoko. no to właśnie korzystam z StrSubstitutor'a podanego przez @Tgc . dziena

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0