Java'da çift ondalık biçimlendirme


118

Bir çiftin ondalık sayılarını biçimlendirmede bazı sorunlar yaşıyorum. Çift değerim varsa, örneğin 4.0, ondalık sayıları 4.00 olacak şekilde nasıl biçimlendirebilirim?




Yanıtlar:


218

Yollardan biri NumberFormat kullanmak olacaktır .

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

Çıktı:

4.00


1
Evet, ama virgül istemiyorum, ondalık işareti istiyorum.
Christoffer

Virgül alıyorum. Yaptığım bu. "çift değişken; NumberFormat formatter = new DecimalFormat (" # 0.00 "); System.out.println (formatter.format (değişken));
Christoffer

bunun için çıktı X.00, X.00 değil
Christoffer

9
JVM'niz tarafından kullanılan varsayılan dil nedeniyle virgül alıyorsunuz, ki bu muhtemelen Nambari'ninkinden farklıdır. NumberFormat javadoc'a
Michael Zilbermann

1
Zim2001'in işaret ettiği gibi, yerel ayarınız farklı olabilir. Cevabımda verilen bağlantıyı okuyun. Sonunda bununla ilgili bilgileri bulacaksınız.
kosa

73

Java 8 ile formatyöntemi kullanabilirsiniz ..: -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • ffloatingpuan değeri için kullanılır ..
  • 2 ondalık gösterimlerden sonra, sonraki ondalık basamakların sayısı .

Çoğu Java sürümü için şunları kullanabilirsiniz DecimalFormat: -

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));

43

String.format kullanın :

String.format("%.2f", 4.52135);

Dokümanlara göre:

Her zaman kullanılan yerel ayar, tarafından döndürülendir Locale.getDefault().


8
String.format ayrıca, ondalık işaret biçimlendirmesini hesaba katmak için bir yerel ayarı ilk parametre olarak kabul eder.
Vincent Mimoun-Prat

4
Yerel ayara özgü ondalık işaretleri (virgül gibi) önlemek için, ABD yerel ayarını belirtin: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233

3
"ABD'ye özgü noktayı ondalık işaret olarak kullanmak, ABD yerel ayarını belirtmek" derdim .. ABD alışkanlıklarının doğru ve diğer her şeyin bir tür "halk" olduğu fikri beni çıldırtıyor.
Simone Gianni

@SimoneGianni Aptalca varsayımlar yapmayın, bazı insanlar ondalık sayıya ihtiyaç duyabilir. Örneğin, bir CSV belgesini dışa aktaran bir işlev yazıyorum ve virgül kullanamıyorum çünkü virgül karakter sınırlayıcıdır.
Kaiser Keister

19

String.format kullanarak bunu yapabilirsiniz:

double price = 52000;
String.format("$%,.2f", price);

Bunu @ Vincent'ın cevabından farklı kılan virgüllere dikkat edin

Çıktı:

$52,000.00

Biçimlendirme için iyi bir kaynak , konuyla ilgili resmi java sayfasıdır


6

Her zaman statik yöntemi kullanabilirsiniz printf from System.out- daha sonra ilgili biçimlendiriciyi uygularsınız; bu, diğer örneklerin yapmanızı gerektirdiği yığın alanından tasarruf sağlar.

Ör:

System.out.format("%.4f %n", 4.0); 

System.out.printf("%.2f %n", 4.0); 

Oldukça büyük bir bonus olan yığın alanından tasarruf sağlar, yine de bu örneğin diğer yanıtlardan çok daha yönetilebilir olduğunu düşünüyorum, özellikle de çoğu programcı C'den printf işlevini bildiği için (Java işlevi / yöntemi biraz değiştirse de).


1
@Baz Burada çok önemli bir ayrıntıyı kaçırıyorum, belirtilen hiçbir printStream yok. OP, standart çıktı akışına (Java belgelerine bakarak daha kolay çözülebilecek) biçimlendirme yardımı istiyor. Açıklamak.
Lewis Robbins

Benim hatam. Yanlış javadoc sürümüne (1.4) bakıyordu. BTW: outbir PrintStream.
Baz

@Baz Endişelenme. Evet, bahsettiğiniz sınıfın bu olduğunu varsaydım, tüm kitaplarımda printf, System.out'taki statik yöntem olarak anılır (bu yöntemler statik olduğundan).
Lewis Robbins

1
Tam olarak, printfstatik bir yöntemdir PrintStream. Buraya bakın ;) Ama yine de +1.
Baz

@Baz Dokümanlardan printStream sınıfı System.out'u miras almıştır. Belki yanılıyor olabilirim - statik bir yöntemi miras almak oldukça garip olsa da (bu mümkün mü?) Doğruyu bekliyorum.
Lewis Robbins

4
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));


1

Alternatif bir yöntem, sınıfın setMinimumFractionDigitsyöntemini kullanmaktır NumberFormat.

Burada temel olarak ondalık noktadan sonra kaç sayı görünmesini istediğinizi belirtirsiniz.

Dolayısıyla , belirttiğiniz miktarın 2 olduğunu varsayarak bir girdi 4.0üretecektir 4.00.

Ancak, Doublegirişiniz belirtilen miktardan daha fazlasını içeriyorsa, belirtilen minimum miktarı alacaktır, ardından yukarı / aşağı yuvarlanmış bir rakam daha ekleyin

Örneğin, 4.15465454belirtilen minimum 2 miktar ile üretecek4.155

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

Çevrimiçi deneyin


1

Bunu yapmanın birçok yolu var. Bunlar aşağıda verilmiştir:

Orijinal numaranızın aşağıda verildiğini varsayalım:

 double number = 2354548.235;

NumberFormat kullanarak:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

String.format kullanarak:

System.out.println(String.format("%,.2f", number));

DecimalFormat ve desen kullanma:

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
        DecimalFormat decimalFormatter = (DecimalFormat) nf;
        decimalFormatter.applyPattern("#,###,###.##");
        String fString = decimalFormatter.format(number);
        System.out.println(fString);

DecimalFormat ve desen kullanma

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

Her durumda çıktı : 2354548.23 olacaktır.

Not :

Yuvarlama sırasında RoundingModebiçimlendiricinize ekleyebilirsiniz . Aşağıda verilen bazı yuvarlama modu verilmiştir:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

İşte ithalatlar :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

Aşağıdaki yöntemlerden herhangi birini kullanabilirsiniz

  1. Eğer kullanıyorsanız java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));

    VEYA

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Basit bir dize biçimine dönüştürmek istiyorsanız

    System.out.println(String.format("%.2f", 4.0)); 

Yukarıdaki kodun tümü 4.00 yazdıracaktır.


0

% 100 çalışır.

import java.text.DecimalFormat;

public class Formatting {

    public static void main(String[] args) {
        double value = 22.2323242434342;
        // or  value = Math.round(value*100) / 100.0;

        System.out.println("this is before formatting: "+value);
        DecimalFormat df = new DecimalFormat("####0.00");

        System.out.println("Value: " + df.format(value));
    }

}

-3

İlk ithalat NumberFormat. Sonra şunu ekleyin:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

Bu size iki ondalık basamak verecek ve para birimiyle ilgileniyorsa bir dolar işareti koyacaktır.

import java.text.NumberFormat;
public class Payroll 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
    int hoursWorked = 80;
    double hourlyPay = 15.52;

    double grossPay = hoursWorked * hourlyPay;
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
    }

}

1
Soru, bir para biriminin görüntülenmesi ile ilgili değildir ve diğer yanıtlarda açıklandığı gibi biçimlendirme işlevleri kullanılarak daha doğru bir şekilde yanıtlanır).
yacc

-4

Bunu şu şekilde yapabilirsiniz:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

1
##Bunun yerine kullandığı için işe yaramıyor00
Joaquin Iurchuk

-4

Bunun eski bir konu olduğunu biliyorum, ancak virgül yerine noktayı gerçekten seviyorsanız, sonucunuzu X, 00 olarak bir String olarak kaydedin ve ardından bir süre için değiştirin, böylece X.00 elde edersiniz.

En basit yol, sadece değiştirmeyi kullanmaktır.

String var = "X,00";
String newVar = var.replace(",",".");

Çıktı, istediğiniz X.00 olacaktır . Ayrıca işleri kolaylaştırmak için hepsini bir arada yapabilir ve çift değişkene kaydedebilirsiniz:

Double var = Double.parseDouble(("X,00").replace(",",".");

Bu cevabın şu anda kullanışlı olmadığını biliyorum ama belki bu forumu kontrol eden biri bunun gibi hızlı bir çözüm arıyor olabilir.

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.