Prymitywne pytanie, ale jak sformatować ciągi takie jak to:
„Krok {1} z {2}”
przez podstawienie zmiennych za pomocą Java? W języku C # jest to łatwe.
Prymitywne pytanie, ale jak sformatować ciągi takie jak to:
„Krok {1} z {2}”
przez podstawienie zmiennych za pomocą Java? W języku C # jest to łatwe.
Odpowiedzi:
Oprócz String.format również spójrz java.text.MessageFormat
. Format mniej zwięzły i nieco bliższy podanemu przez Ciebie przykładowi C # i możesz go również użyć do analizy.
Na przykład:
int someNumber = 42;
String someString = "foobar";
Object[] args = {new Long(someNumber), someString};
MessageFormat fmt = new MessageFormat("String is \"{1}\", number is {0}.");
System.out.println(fmt.format(args));
Lepszy przykład wykorzystuje ulepszenia varargs i autoboxing w Javie 1.5 i zamienia powyższe w jedno-liniowy:
MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");
MessageFormat
jest trochę ładniejszy do robienia liczby mnogiej i18niz z modyfikatorem wyboru. Aby określić komunikat, który poprawnie używa liczby pojedynczej, gdy zmienna ma wartość 1, a w innym przypadku liczby mnogiej, możesz zrobić coś takiego:
String formatString = "there were {0} {0,choice,0#objects|1#object|1<objects}";
MessageFormat fmt = new MessageFormat(formatString);
fmt.format(new Object[] { new Long(numberOfObjects) });
MessageFormat.format("Number {0}", 1234));
można Number 1,234
zamiast tego wygenerować następujący kod w zależności od domyślnych ustawień regionalnych Number 1234
.
{0} it ll take firstname
, kiedy {1} then lastname
, tak. Czy to możliwe, {0,choice,0.getFirstName()}
czy coś takiego?
Spójrz na String.format . Należy jednak pamiętać, że pobiera specyfikatory formatu podobne do tych z rodziny funkcji printf C - na przykład:
String.format("Hello %s, %d", "world", 42);
Zwróciłby „Hello world, 42”. Może ci się to przydać podczas poznawania specyfikatorów formatu. Andy Thomas-Cramer był na tyle miły, że zostawił ten link w komentarzu poniżej, który wydaje się wskazywać na oficjalną specyfikację. Najczęściej używane to:
Jest to diametralnie różne od C #, który wykorzystuje odwołania pozycyjne z opcjonalnym specyfikatorem formatu. Oznacza to, że nie możesz robić takich rzeczy jak:
String.format("The {0} is repeated again: {0}", "word");
... bez faktycznego powtarzania parametru przekazanego do printf / format. (patrz komentarz Scrum Meister poniżej)
Jeśli chcesz wydrukować wynik bezpośrednio, możesz znaleźć System.out.printf ( PrintStream.printf ) według własnych upodobań.
String.format
może również zajmować pozycje numeryczne: String.format("%2$s %1$s", "foo", "bar");
wyświetlibar foo
Jeśli zdecydujesz się nie używać String.format, drugą opcją jest + operator binarny
String str = "Step " + a + " of " + b;
Jest to odpowiednik
new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));
Niezależnie od tego, którego używasz, to twój wybór. StringBuilder jest szybszy, ale różnica prędkości jest znikoma. Wolę używać +
operatora (który robi StringBuilder.append(String.valueOf(X)))
i łatwiej go czytać).
+
działa operator. 2) Twoje wyjaśnienie nie jest nawet dokładne. +
jest równoważne z używaniem StringBuilder
, a nie String.concat
. (Zbyt wiele informacji na ten temat.)
Napisałem do tego moją prostą metodę:
public class SomeCommons {
/** Message Format like 'Some String {0} / {1}' with arguments */
public static String msgFormat(String s, Object... args) {
return new MessageFormat(s).format(args);
}
}
dzięki czemu możesz użyć go jako:
SomeCommons.msfgFormat("Step {1} of {2}", 1 , "two");
public class StringFormat {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
System.out.println("================================");
for(int i=0;i<3;i++){
String s1=sc.next();
int x=sc.nextInt();
System.out.println(String.format("%-15s%03d",s1,x));
}
System.out.println("================================");
}
}
outpot "================================"
ved15space123 ved15space123 ved15space123 "=========== =====================
Rozwiązanie Java
„-” służy do opuszczania wcięcia
„15” oznacza, że minimalna długość ciągu to 15
To rozwiązanie działało dla mnie. Musiałem dynamicznie tworzyć adresy URL dla klienta REST, więc utworzyłem tę metodę, więc po prostu musisz przekazać restURL w ten sposób
/customer/{0}/user/{1}/order
i dodaj tyle parametrów, ile potrzebujesz:
public String createURL (String restURL, Object ... params) {
return new MessageFormat(restURL).format(params);
}
Musisz tylko wywołać tę metodę w następujący sposób:
createURL("/customer/{0}/user/{1}/order", 123, 321);
Wyjście
„/ customer / 123 / user / 321 / order”
Napisałem tę funkcję, robi to właściwie. Interpoluj słowo zaczynające się $
od wartości zmiennej o tej samej nazwie.
private static String interpol1(String x){
Field[] ffield = Main.class.getDeclaredFields();
String[] test = x.split(" ") ;
for (String v : test ) {
for ( Field n: ffield ) {
if(v.startsWith("$") && ( n.getName().equals(v.substring(1)) )){
try {
x = x.replace("$" + v.substring(1), String.valueOf( n.get(null)));
}catch (Exception e){
System.out.println("");
}
}
}
}
return x;
}