Java'da çift formatlamak için String.format ()


178

Nasıl aşağıdaki gibi bir çift biçimlendirmek için String.format (biçim String, X) kullanabilirsiniz ???

2354548.235 -> 2.354.548.23

Teşekkürler!

Yanıtlar:


295
String.format("%1$,.2f", myDouble);

String.format otomatik olarak varsayılan yerel ayarı kullanır.


36
Ayrıca, belirli bir yerel ayarı kullanarakString.format(Locale.GERMAN, "%1$,.2f", myDouble);
Olivier Grégoire

13
Biçimlendirilecek birden fazla çift varsa,% 1,% 2 vb. Kullanın. Örneğin String.format ("% 1 $ ,. 2f,% 2 $ ,. 2f", myDouble, aDouble)
Moesio

4
Bu durumda "% 1 $" ın isteğe bağlı olduğuna inanıyorum. Benim için String olarak sadece "% ,. 2f" ile çalışır.
Matt Passell

5
Evet, Matt haklı. %1, %2vb. çıktıları girdi argümanlarınızın dizinine göre yeniden sıralamak için kullanılabilir. Bkz bu . Dizini atlayabilirsiniz ve varsayılan sipariş biçimlendirici tarafından kabul edilir.
praneetloke

1
Farklı kısımların ne anlama geldiğini açıklamalısınız.
Mitulát báti

41
String.format("%4.3f" , x) ;

Bu, ans'ta toplam 4 basamağa ihtiyacımız olduğu anlamına gelir; bunların 3'ü ondalık basamaktan sonra olmalıdır. Ve f, çiftin format belirleyicisidir. x, bulmak istediğimiz değişkeni ifade eder. Benim için çalıştı. . .


1
Sanırım ondalıktan sonra 3 basamak takip eden ve takip eden argümanlarda dördüncü değişken olacak.
Michael Fulton

@MichaelFulton O kadar kolay değil: String.format("%014.3f" , 58.656565)-> 0000000058,657: Toplam 14 sembol: 8 sıfır ve 5 sayı ve 1 virgül. Yani bu durumda sayı , sonuç dizesindeki 14 toplam sembol sayısı (ekstralar sıfır ile değiştirilir, onsuz gidebilir, sonra boşlukla değiştirilir) anlamına gelir . Görevin burada tamamen bağımsızdır. .3
parsecer

Ancak burada: String.format("%014.3f" , 58.656565)-> 58,657. Bunu tercih ediyorum çünkü tercih .3fbölüme gidiyor : önce sayıyı 3 ondalık basamakla yazdırıyor ve sonra kalan semboller varsa boşluklar (veya sıfırlar / herhangi bir şey) yazdırıyor. Bu durumda sayı 2 + 3 + 1 = 6 sembol ve sadece 4 basmak istedik, bu yüzden kesinlikle fazladan boşluk yok.
parsecer

24

Manuel olarak ayarlanmış sembollerle biçimlendirmek istiyorsanız, bunu kullanın:

DecimalFormatSymbols decimalFormatSymbols = new DecimalFormatSymbols();
decimalFormatSymbols.setDecimalSeparator('.');
decimalFormatSymbols.setGroupingSeparator(',');
DecimalFormat decimalFormat = new DecimalFormat("#,##0.00", decimalFormatSymbols);
System.out.println(decimalFormat.format(1237516.2548)); //1,237,516.25

Yerel ayarlara dayalı biçimlendirme tercih edilir.


3
Yararlı cevap! Bununla birlikte, son cümle "Yerel ayara dayalı biçimlendirme tercih edilir, ancak" bağlam olmadan bir anlam ifade etmez. Dize'nin belirli bir biçimini oluşturmak istediğinizde, yerel ayar tabanlı biçimlendirmeyi KULLANMAMANIZ gereken oldukça iyi kullanım durumları vardır. Örneğin, verilerinizi harici bir dosyaya dışa aktarıyorsunuz ve geçerli (veya herhangi bir) yerel ayara bağlı olmayan biçim üzerinde tam kontrole sahip olmak istiyorsunuz.
Honza Zidek

20

bu bağlantıdan çıkarılan kod ;

Double amount = new Double(345987.246);
NumberFormat numberFormatter;
String amountOut;

numberFormatter = NumberFormat.getNumberInstance(currentLocale);
amountOut = numberFormatter.format(amount);
System.out.println(amountOut + " " + 
                   currentLocale.toString());

Bu örnekteki çıktı, aynı sayı biçiminin Yerel Ayarla nasıl değiştiğini gösterir:

345 987,246  fr_FR
345.987,246  de_DE
345,987.246  en_US

13
public class MainClass {
   public static void main(String args[]) {
    System.out.printf("%d %(d %+d %05d\n", 3, -3, 3, 3);

    System.out.printf("Default floating-point format: %f\n", 1234567.123);
    System.out.printf("Floating-point with commas: %,f\n", 1234567.123);
    System.out.printf("Negative floating-point default: %,f\n", -1234567.123);
    System.out.printf("Negative floating-point option: %,(f\n", -1234567.123);

    System.out.printf("Line-up positive and negative values:\n");
    System.out.printf("% ,.2f\n% ,.2f\n", 1234567.123, -1234567.123);
  }
}

Ve çıktısını alın:

3 (3) +3 00003
Varsayılan kayan noktalı biçim: 1234567,123000
Virgül içeren
kayan nokta: 1.234.567,123000
Negatif kayan noktalı varsayılan: -1.234.567,123000 Negatif kayan noktalı seçenek: (1.234.567, 123000)

Sıralı pozitif ve negatif değerler:
1.234.567,12
-1.234.567,12


2

Bunu yapmanın birçok yolu var. Bunlar feryat verilir:

Orijinal numaranızın aşağıda verildiğini varsayalım: çift sayı = 2354548.235;

Kullanma NumberFormatve Yuvarlama modu

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
    DecimalFormat decimalFormatter = (DecimalFormat) nf;
    decimalFormatter.applyPattern("#,###,###.##");
    decimalFormatter.setRoundingMode(RoundingMode.CEILING);

    String fString = decimalFormatter.format(number);
    System.out.println(fString);

Dize biçimlendiricisini kullanma

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

Her durumda çıktı : 2354548.24

Not :

Yuvarlama sırasında RoundingModebiçimlendiricinize ekleyebilirsiniz . Aşağıda verilen bazı Yuvarlama modları 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 ithalat :

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

1

kullanım DecimalFormat

 NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
 DecimalFormat decimalFormatter = (DecimalFormat) nf;
 decimalFormatter.applyPattern("#,###,###.##");
 String fString = decimalFormatter.format(myDouble);
 System.out.println(fString);
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.