Java'da dizeleri biçimlendirme


Yanıtlar:


140

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");

MessageFormatseç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) });

21
MessageFormat yerelleştirme amaçlıdır, bu nedenle kullanırken dikkatli olun. Örneğin MessageFormat.format("Number {0}", 1234));, varsayılan yerel ayara bağlı olarak aşağıdaki kod Number 1,234yerine üretebilir Number 1234.
pavel_kazlou

@ataylor: Merhaba, Üzgünüm ama biraz kafam karıştı. Böyle bir şey istiyorum ben veri ve ne zaman {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ü ?
user3145373 ツ

@ user3145373 ツ Sanmıyorum.
ataylor

Tamam, istediğim gibi bir .Net projesine başvurdum , codeproject.com/Articles/42310/… , böyle görünüyorum bu projeye bakın. Böyle bir proje veya paket biliyorsanız, lütfen bana bildirin. Teşekkür ederim
user3145373 ツ

233

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:

  • % s - bir dize ekle
  • % d - işaretli bir tam sayı ekle (ondalık)
  • % f - gerçek bir sayı ekle, standart gösterim

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.


2
Başka bir seçenek, {1} stil formatı sembollerini kabul eden java.text.MessageFormat. String.format () 'ın biçim sembolleri, C'nin printf () biçimindeki simgelere benzeyebilir, ancak farklı olabilir. Bkz download.oracle.com/javase/6/docs/api/java/util/... tam sözdizimi için.
Andy Thomas

53
String.formatsayısal pozisyonlar da alabilir: String.format("%2$s %1$s", "foo", "bar");çıkışbar foo
Scrum Meister

7

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).


5
Beni ihmal edeceksen, lütfen nedenini açıkla.
Ryan Amos

11
1) Dize biçimlendirme ile ilgili bir soruya yanıt olarak, +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.)
Søren Løvborg

6

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");

5
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

  • "S" (% 'den sonraki birkaç karakterdir) bizim Dizemiz ile değiştirilecektir
  • 0, tamsayımızı solda 0s ile doldurur
  • 3 tamsayımızı minimum 3 uzunluğunda yapar


1

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"


0

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.