İlkel soru, ancak böyle dizeleri nasıl biçimlendiririm:
"{2} / {1} Adımı"
kullanarak değişkenleri değiştirerek? C # 'da kolaydır.
İlkel soru, ancak böyle dizeleri nasıl biçimlendiririm:
"{2} / {1} Adımı"
kullanarak değişkenleri değiştirerek? C # 'da kolaydır.
Yanıtlar:
String.format'a ek olarak, bir göz atın java.text.MessageFormat
. Biçim, daha az kısa ve sağladığınız C # örneğine biraz daha yakındır ve ayrıştırmak için de kullanabilirsiniz.
Örneğin:
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));
Daha güzel bir örnek, Java 1.5'teki varargs ve otomatik boks geliştirmelerinden yararlanır ve yukarıdakileri tek katmanlı hale getirir:
MessageFormat.format("String is \"{1}\", number is {0}.", 42, "foobar");
MessageFormat
seçim değiştirici ile i18nized çoğulları yapmak için biraz daha hoş. Değişken 1 ve çoğul olduğunda tekil formu doğru kullanan bir ileti belirtmek için, bunun gibi bir şey yapabilirsiniz:
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));
, varsayılan yerel ayara bağlı olarak aşağıdaki kod Number 1,234
yerine üretebilir Number 1234
.
{0} it ll take firstname
, ne zaman {1} then lastname
, gibi sınıf nesnesi geçmek ll . Bunun gibi bir {0,choice,0.getFirstName()}
şey mümkün mü ?
String.format'a bir göz atın . Bununla birlikte, C'nin printf işlev ailesindekilere benzer biçim belirteçleri aldığını unutmayın - örneğin:
String.format("Hello %s, %d", "world", 42);
"Merhaba dünya, 42" dönecekti. Biçim belirteçlerini öğrenirken bunu faydalı bulabilirsiniz . Andy Thomas-Cramer, resmi bağlantıyı işaret ettiği anlaşılan aşağıdaki yorumda bu bağlantıyı bırakacak kadar nazikti . En sık kullanılanlar:
Bu, isteğe bağlı biçim belirleyicisiyle konumsal referanslar kullanan C # 'dan kökten farklıdır. Bu şu gibi şeyleri yapamayacağınız anlamına gelir:
String.format("The {0} is repeated again: {0}", "word");
... printf / format'a aktarılan parametreyi tekrar etmeden. (Scrum Meister'ın aşağıdaki yorumuna bakınız)
Sonucu doğrudan yazdırmak istiyorsanız, System.out.printf'i ( PrintStream.printf ) beğeninize göre bulabilirsiniz.
String.format
sayısal pozisyonlar da alabilir: String.format("%2$s %1$s", "foo", "bar");
çıkışbar foo
String.format'ı kullanmamayı seçerseniz, diğer seçenek + ikili işleçtir
String str = "Step " + a + " of " + b;
Bu,
new StringBuilder("Step ").append(String.valueOf(1)).append(" of ").append(String.valueOf(2));
Hangisini kullanırsanız kullanın seçiminiz. StringBuilder daha hızlı, ancak hız farkı marjinal. +
Operatörü kullanmayı tercih ediyorum (ki bunu yapan StringBuilder.append(String.valueOf(X)))
ve okumayı daha kolay bulan).
+
operatörün nasıl çalıştığını açıklarsınız. 2) Açıklamanız doğru değil. +
kullanmakla eşdeğerdir StringBuilder
, değil String.concat
. (Bu konuda çok fazla bilgi var.)
Bunun için basit yöntemimi yazdım:
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);
}
}
böylece şu şekilde kullanabilirsiniz:
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 "=========== =====================
Java çözümü
Sol girinti için "-" kullanılır
"15", String'in minimum uzunluğunu 15 yapar
Bu çözüm benim için çalıştı. Dinamik olarak bir REST istemcisi için URL oluşturmak gerekiyordu, bu yüzden bu yöntemi oluşturdum, bu yüzden sadece restURL böyle geçmek zorunda
/customer/{0}/user/{1}/order
ve ihtiyacınız olduğu kadar çok parametre ekleyin:
public String createURL (String restURL, Object ... params) {
return new MessageFormat(restURL).format(params);
}
Bu yöntemi şöyle çağırmanız yeterlidir:
createURL("/customer/{0}/user/{1}/order", 123, 321);
Çıktı
"/ Müşteri / 123 / user / 321 / düzen"
Bu işlevi yazdım, sadece doğru olanı yapıyor. $
Aynı ada sahip değişkenin değeri ile başlayan bir kelimeyi enterpolasyonlayın .
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;
}