Java'da uzun bir tamsayıyı ayırıcı olmadan bir dize olarak nasıl biçimlendirebilirim?


122

Basit bir soru, ama bahse girerim ki burada sormak muhtemelen aşağıdakiler için belgeleri anlamaya çalışmaktan daha basit olacaktır MessageFormat:

long foo = 12345;
String s = MessageFormat.format("{0}", foo);

Gözlemlenen değer "12,345".

İstenilen değer "12345" dir.

Yanıtlar:


62

Sadece kullan Long.toString(long foo)


12
VeyaString.valueOf(long)
rsp

6
String.valueOf () Long.toString () 'i çağırıyor
Peter Lawrey

7
Belki bu önemsiz bir durumdur, ancak bu durumda Long.toString (foo) 'nun belgelenmemiş bir davranışına güveniyorsunuz. Bu nedenle Daniel Fortunov'un cevabını tercih ediyorum.
John K

4
Belgelenmemiş değil. Download.oracle.com/javase/6/docs/api/java/lang/… adresine bakın .
Rob H

3
Tamam, ancak bu çözüm ResourceBundle'daki mesaj biçimlendirmesi için geçerli değildir. Tuto i18n
Guillaume Husta

332
MessageFormat.format("{0,number,#}", foo);

1
Teşekkürler, bunu MessageFormat özellikleri enjeksiyonu ile yapmaya çalışıyordum. İyi ki bunu yapmanın birden fazla yolu var!
Philihp Busby

3
bu yolu tercih ederim. çünkü dil özellikleri dosyamdaki biçimi değiştirmeme izin veriyor.
Pascal

2
Mükemmel çözüm! Biçimlendirme / biçimlendirme seçeneğini kod düzeyi yerine referans verilerinde tutmama yardımcı oldu - teşekkürler! Ve @SebastianRoth'un dediği gibi - bu kabul edilen cevap olmalıydı.
Ofer Lando

9
Formatter API ile sayısal dizeleri
güzelleştirmenin

1
Bu, kalıbı alıntılarsanız bir seçim formatında da çalışır:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0

1

Uluslararasılaştırma vb. İle "gerçek dünya" kalıpları yapmaya çalışırken bununla biraz uğraştım. Spesifik olarak, çıktının gösterilen değerlere bağlı olduğu bir "seçim" formatı kullanma ihtiyacımız var ve bunun java.text.ChoiceFormatiçin var.

İşte bunun nasıl yapılacağına dair bir örnek:

    MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");

    int[] nums = new int[] {
            0,
            1,
            100,
            1000,
            10000,
            100000,
            1000000,
            10000000
    };

    Object[] a = new Object[1];
    for(int num : nums) {
        a[0] = num;
        System.out.println(fmt.format(a));
    }

Bu, aşağıdaki çıktıyı üretir; Umarım aynı tür şeyleri başarmaya çalışan başkaları için yararlıdır:

zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000

Gördüğünüz gibi, "seçim" biçimi, biçimlendirilecek olan değere bağlı olarak kullanılacak biçim türünü seçmemize olanak tanır. Küçük sayılar metinle değiştirilebilir (orijinal değer görüntülenmez). Orta büyüklükteki sayılar, gruplama ayırıcıları olmadan (virgül olmadan) gösterilir. En büyük sayılar yine virgül içerir. Açıkçası, bu, esnekliğini göstermek için tamamen uydurulmuş bir örnektir java.text.MessageFormat.

#Biçim metninde alıntılananlar hakkında bir not : hem ChoiceFormatve hem MessageFormatde kullanıldığından, ikisi arasında meta karakterler arasında bir çakışma vardır. ChoiceFormatkullanımları #esasen vasıta "eşittir" bir meta karakter şekilde biçimlendirme motoru durumunda bu örneğin bilir 1#one!biz karşılaştırdığınız {0}ile 1ve eşit iseler, o kadar belirli bir "seçim" kullanır.

Ama #başka bir anlamı var MessageFormatve bu, DecimalFormat"buraya bir sayı koy" anlamına gelen bir meta karakterdir.

Bir ChoiceFormatdizgeye sarıldığı için, #alıntı yapılması gerekir. Ne zaman ChoiceFormatdizesini ayrıştırma yapılır için subformats geçerken, bu tırnaklar kaldırılır MessageFormat(ve sonra üzerine DecimalFormat).

Bu yüzden, kullanırken {0,choice,...}, bu #karakterleri ve muhtemelen diğerlerini alıntı yapmanız gerekir .


0

En kısa yol

long foo = 12345;
String s = ""+foo;

3
Ve, her zaman olduğu gibi, bu genişler, new StringBuilder("").append(foo).toString()böylece gerçekten optimal değildir.
RAnders00

1
@ RAnders00 Bir sayıyı tek bir dizgeye dönüştürmek, genellikle bağlamdan tamamen kaçınmak için en uygun seçenek değildir, ancak kullanabileceğiniz en basit kalıp için""+
Peter Lawrey

1
Haklısın, ama ben sadece bunu belirtmek istedim çünkü insanlar her zaman bunu belirtme eğilimindeler.
RAnders00

1
@ RAnders00 btw, bir mesaj formatı kullanmak, bu durumda daha pahalıdır ve daha karmaşıktır.
Peter Lawrey

Evet, bunun yerine Long.toString()bu çözümün arka planda kullandığı şey bu olduğu için kullanılmalı :)
RAnders00

-1

Alternatif olarak String.formatve java.util.Formattersizin için de işe yarayabilir ...


-6

Deneyebilirsin:

String s = new Long(foo).toString();

8
Gereksiz nesne oluşturma. Sarmalayıcı sınıflarıyla asla yeni kullanmayın.
keiki
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.