Bir Dize numarasını virgül ve yuvarlak olacak şekilde nasıl biçimlendirebilirim?


142

Bana verilen bir dizeyi Dize olarak biçimlendirmenin en iyi yolu nedir?

String number = "1000500000.574" //assume my value will always be a String

Bu değeri olan bir dize olmasını istiyorum: 1,000,500,000.57

Nasıl bu şekilde biçimlendirebilirim?

Yanıtlar:


256

DecimalFormatSınıfa bakmak isteyebilirsiniz ; farklı yerel ayarları destekler (örneğin: 1.000.500.000,57bunun yerine biçimlendirilecek bazı ülkelerde ).

Ayrıca bu dizeyi bir sayıya dönüştürmeniz gerekir, bu ile yapılabilir:

double amount = Double.parseDouble(number);

Kod örneği:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));

Bu özel durumla NumberFormat'ı nasıl kullanabileceğime bir örnek gösterebilir misiniz?
Sheehan Alam

1
ayrıca aşağıdaki çözümü de kullanabilirsiniz - public static String getRoundOffValue (çift değer) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); dönüş df.format (değer); }
Jitendra Nath

Ben de DecimalFormat formatter = new DecimalFormat ("#, ## 0.00") gibi noktadan önce sıfırı tercih ederim; - sıfır için .00 almak benim için yanlış geliyor
Leo

45

Bu, bir dizede birden çok sayıyı biçimlendiriyorsanız daha kolay ve / veya daha esnek olabilen String.format () kullanılarak da gerçekleştirilebilir.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

Biçim dizesi için "% ,. 2f" - "," virgül içeren ayrı basamak grupları anlamına gelir ve ".2" ondalık basamaktan sonra iki yere yuvarlanır.

Diğer biçimlendirme seçeneklerine referans için bkz. Https://docs.oracle.com/javase/tutorial/java/data/numberformat.html


42

Dizenizi bir sayıya dönüştürdükten sonra,

// format the number for the default locale
NumberFormat.getInstance().format(num)

veya

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)

Nasıl hem yerel belirtmek ve (diyelim) 2 ondalık için yuvarlak?
Jonik

6
Ah, new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
boş ver

16

Bunun Google için bir numaralı sonuç olduğu göz önüne alındığında format number commas java, tam sayılarla çalışan ve ondalık sayıları önemsemeyen kişiler için çalışan bir yanıt.

String.format("%,d", 2000000)

çıktılar:

2,000,000

ayrıca şamandıralar için de çalışır, örn. printf ("%, f \ n", ondalık sayı)
philwalk

12

Kendi biçimlendirme aracımı oluşturdum. Hangi size birçok özellik vermek ile birlikte biçimlendirme işleme son derece hızlı :)

Destekler:

  • Virgül Biçimlendirme Ör. 1234567, 1.234.567 olur.
  • "Bin (K), Milyon (M), Milyar (B), Trilyon (T)" ile ön ek.
  • 0 ile 15 arasında hassasiyet.
  • Hassas yeniden boyutlandırma (6 basamaklı doğruluk istiyorsanız, ancak yalnızca 3 basamağa sahip olmanız anlamına gelir) 3'e zorlar.
  • Önek azaltma (Seçtiğiniz önek çok büyükse, onu daha uygun bir önek haline getirir).

Kod burada bulunabilir . Buna şöyle diyorsunuz:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

Ayrıca, ondalık desteği işlemediğini, ancak tamsayı değerleri için çok yararlı olduğunu da belirtmeliyim. Yukarıdaki örnek çıktı olarak "1.23M" gösterecektir. Muhtemelen ondalık destek ekleyebilirdim, ama bunun için çok fazla kullanım görmedim, o zamandan beri bunu matematik hesaplamaları için sıkıştırılmış char [] dizilerini işleyen bir BigInteger sınıfında birleştirebilirim.


2
Yalnızca İngilizce dilinde çalışıyorsanız bu iyi olur. Benim önerim, İngilizce olmayan kullanıcılarımın akşam yemeğini kızdıran şeyden kaçınmaktır, çünkü ne Kveya ne anlama Mgeldiğini anlayamazlar
rishabhmhjn

@rishabhmhjn ama ... İhtiyacınız olan herhangi bir harfle değiştirmek için onu değiştiremez misiniz? senin kötü şansın onun hatası mı? : o ve yarattığı şey oldukça iyi, bağlantı şu anda kullanılamıyor gibi görünse de ..
Kova Gücü

@AquariusGüç sorunu, örneğin, Japonca sayılar metrik sistemi takip etmiyor. Sayıları 100 için 1 百, 1000 için 1 千, 10000 için 1,, daha sonra 1000,0000 için 1 becomes olur. Ekibim Javascript'te benzer bir şey üzerinde çalışıyordu. Burada belirtilen mantığı kullanabilirsiniz: github.com/statusbrew/angular-bignumber
rishabhmhjn

Bunun için eski kodumu buldum, bu yüzden GitHub'a yeniden yükledim. Yorumdaki bağlantı güncellendi.
Jeremy Trifilo

6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}

6

ayrıca aşağıdaki çözümü de kullanabilirsiniz -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}

4

Aşağıdaki kodu kullanarak dönüşümün tamamını tek bir satırda yapabilirsiniz:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

DecimalFormat yapıcısındaki son iki # işareti de 0 olabilir. Her iki şekilde de çalışır.


3

İlk cevap çok iyi çalışıyor, ancak ZERO / 0 için .00 olarak biçimlendirilecek

Bu nedenle #, ## 0.00 biçimi benim için iyi çalışıyor. Üretim sistemine dağıtımdan önce daima 0/100 / 2334.30 gibi farklı sayıları ve negatif sayıları test edin.


3

İşte oraya ulaşmanın en basit yolu:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

çıktı: 10.987.655,88

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.