NumberFormat ve printf
NumberFormat, DecimalFormat ve printf kalıplarını kullanarak sayıları görüntüleme amacıyla biçimlendirin.
NumberFormat ve printf, CoddyKit'te ücretsiz bir Java Academy dersidir. Bu, 4 dersinin 4. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, Java Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. Java Academy kursu toplamda 4 dersten oluşur.
NumberFormat ve printf
Java, zengin sayı biçimlendirme API'leri sunar: yerel ayara duyarlı para birimi ve yüzde biçimlendirmesi için NumberFormat, özel örüntüler için DecimalFormat ve C stili biçimlendirme için printf/String.format.
String.format Temelleri
String.format(), dizeler oluşturmak için biçim belirteçlerini kullanır. Yaygın belirteçler: %d (tamsayı), %f (kayan noktalı sayı), %s (dize), %n (satır sonu).
String name = "Alice";
int score = 95;
double avg = 87.567;
String msg = String.format(
"Player: %s | Score: %d | Average: %.2f", name, score, avg);
System.out.println(msg);
// Player: Alice | Score: 95 | Average: 87.57
// printf is equivalent — formats directly to output
System.out.printf("%-10s %5d %8.2f%n", name, score, avg);
// Alice 95 87.57Genişlik, Dolgu ve Hizalama
Biçim belirteçleri genişlik ve hizalama bayraklarını destekler: %10d (10 karakter içinde sağa hizalama), %-10d (sola hizalama), %010d (sıfırlarla doldurma).
// Table layout with padding
System.out.printf("%-20s %10s %10s%n", "Product", "Qty", "Price");
System.out.printf("%-20s %10d %10.2f%n", "Java Book", 3, 49.99);
System.out.printf("%-20s %10d %10.2f%n", "USB Hub", 1, 24.95);
System.out.printf("%-20s %10d %10.2f%n", "Mechanical Keyboard", 2, 129.00);
// Zero-padding for order IDs
int orderId = 42;
System.out.printf("Order: ORD-%08d%n", orderId); // Order: ORD-00000042Para Birimi için NumberFormat
NumberFormat.getCurrencyInstance(Locale), sayıları belirli bir yerel ayar için doğru sembol, ayraç ve ondalık basamaklarla para birimi dizeleri olarak biçimlendirir.
import java.text.*;
import java.util.*;
NumberFormat usd = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat eur = NumberFormat.getCurrencyInstance(Locale.GERMANY);
NumberFormat gbp = NumberFormat.getCurrencyInstance(Locale.UK);
double amount = 1234567.89;
System.out.println(usd.format(amount)); // $1,234,567.89
System.out.println(eur.format(amount)); // 1.234.567,89 EUR
System.out.println(gbp.format(amount)); // GBP1,234,567.89Yüzdeler için NumberFormat
NumberFormat.getPercentInstance(), bir ondalık sayıyı yüzde dizesi olarak biçimlendirir. 0 ile 1 arasında bir değer geçiriniz.
import java.text.*;
import java.util.*;
NumberFormat pct = NumberFormat.getPercentInstance(Locale.US);
pct.setMaximumFractionDigits(1);
System.out.println(pct.format(0.75)); // 75%
System.out.println(pct.format(0.1234)); // 12.3%
System.out.println(pct.format(1.0)); // 100%
// Conversion rate in e-commerce
double convRate = 3_456.0 / 42_000.0;
System.out.println("Conversion: " + pct.format(convRate)); // 8.2%Özel Örüntülerle DecimalFormat
DecimalFormat, # karakterinin isteğe bağlı basamağı, 0 karakterinin ise zorunlu basamağı ifade ettiği bir örüntü dizesi kullanır.
import java.text.*;
DecimalFormat df1 = new DecimalFormat("#,###.00");
System.out.println(df1.format(1234567.5)); // 1,234,567.50
DecimalFormat df2 = new DecimalFormat("000.0");
System.out.println(df2.format(7.5)); // 007.5
DecimalFormat df3 = new DecimalFormat("0.00E0");
System.out.println(df3.format(0.000123)); // 1.23E-4
// Scientific notation for large values
DecimalFormat sci = new DecimalFormat("0.000E0");
System.out.println(sci.format(123456789)); // 1.235E8Dizelerden Sayıları Ayrıştırma
NumberFormat, yerel ayara göre biçimlendirilmiş dizeleri sayılara da ayrıştırabilir. Bu, farklı yerel ayarlarda kullanıcı girdisini okumak için gereklidir.
import java.text.*;
import java.util.*;
NumberFormat nf = NumberFormat.getInstance(Locale.GERMANY);
try {
// German uses comma as decimal separator
Number parsed = nf.parse("1.234,56");
System.out.println(parsed.doubleValue()); // 1234.56
// Parse US currency string
NumberFormat usd = NumberFormat.getCurrencyInstance(Locale.US);
Number amount = usd.parse("$1,234.56");
System.out.println(amount.doubleValue()); // 1234.56
} catch (ParseException e) {
System.out.println("Parse error: " + e.getMessage());
}Biçimlendirilmiş Dizeler (Java 15+)
Java 15+, yöntem zincirlerinde ve akış işlem hatlarında kullanışlı olan, String.format()'e alternatif bir örnek yöntemi olarak String.formatted() yöntemini ekler.
record Product(String name, double price, int stock) {}
var products = List.of(
new Product("Laptop", 999.0, 5),
new Product("Mouse", 29.99, 42),
new Product("Monitor", 349.0, 8)
);
products.stream()
.map(p -> "%-15s $%8.2f [stock: %d]"
.formatted(p.name(), p.price(), p.stock()))
.forEach(System.out::println);
// Laptop $ 999.00 [stock: 5]
// Mouse $ 29.99 [stock: 42]
// Monitor $ 349.00 [stock: 8]Sayı Gruplandırma ve Yerel Ayar
Sayı gruplandırması (binlik ayraç) yerel ayara göre değişir. Kullanıcıya gösterilen çıktıda virgülleri sabit olarak yazmak yerine her zaman NumberFormat kullanınız.
import java.text.*;
import java.util.*;
long users = 1_234_567;
for (Locale locale : new Locale[]{Locale.US, Locale.FRANCE, Locale.GERMANY}) {
NumberFormat nf = NumberFormat.getIntegerInstance(locale);
System.out.printf("%-10s: %s%n", locale, nf.format(users));
}
// en_US : 1,234,567
// fr_FR : 1 234 567
// de_DE : 1.234.567Fatura Oluşturma Örneği
Tümünü bir araya getirme: doğru para birimi, yüzde ve tablo hizalamasıyla biçimlendirilmiş bir fatura çıktısı oluşturma.
import java.text.*;
import java.util.*;
NumberFormat curr = NumberFormat.getCurrencyInstance(Locale.US);
NumberFormat pct = NumberFormat.getPercentInstance();
pct.setMaximumFractionDigits(0);
double subtotal = 1259.97;
double discount = 0.10;
double discountAmt = subtotal * discount;
double taxRate = 0.08;
double taxAmt = (subtotal - discountAmt) * taxRate;
double total = subtotal - discountAmt + taxAmt;
System.out.println("=== INVOICE ===");
System.out.printf("%-20s %15s%n", "Subtotal", curr.format(subtotal));
System.out.printf("%-20s %15s%n", "Discount (" + pct.format(discount) + ")",
"-" + curr.format(discountAmt));
System.out.printf("%-20s %15s%n", "Tax (" + pct.format(taxRate) + ")",
curr.format(taxAmt));
System.out.printf("%-20s %15s%n", "TOTAL", curr.format(total));Yaygın Tuzaklar
Şu yaygın biçimlendirme hatalarına dikkat ediniz:
String.formatile yanlış tür belirteci kullanmak (örneğin birdoubleiçin%dkullanmak)IllegalFormatConversionExceptionoluşturur- Yerel ayara özgü biçimlendiriciler farklı makinelerde farklı çıktılar üretir
- NumberFormat örnekleri iş parçacığı açısından güvenli değildir; iş parçacığı başına bir tane oluşturunuz veya
ThreadLocalkullanınız
// Wrong specifier
try {
String.format("%d", 3.14); // IllegalFormatConversionException
} catch (java.util.IllegalFormatConversionException e) {
System.out.println("Wrong format specifier!");
}
// Thread-safe pattern using ThreadLocal
ThreadLocal<NumberFormat> localFmt = ThreadLocal
.withInitial(() -> NumberFormat.getCurrencyInstance(Locale.US));
// each thread gets its own NumberFormat instanceHızlı Kontrol
String.format("%08.2f", 3.5) ne üretir?
Özet: NumberFormat ve printf
Önemli çıkarımlar:
- String.format / printf biçim belirteçlerini kullanır: %d, %f, %s, %.2f
- Genişlik ve hizalama bayrakları: %10d (sağa), %-10d (sola), %010d (sıfırlarla doldurma)
- Yerel ayara duyarlı para birimi gösterimi için NumberFormat.getCurrencyInstance()
- Yüzde çıktısı için NumberFormat.getPercentInstance()
- DecimalFormat, # (isteğe bağlı) ve 0 (zorunlu) basamak örüntülerini kullanır
- NumberFormat, yerel ayara göre biçimlendirilmiş dizeleri sayılara geri ayrıştırabilir
Sıkça Sorulan Sorular
“NumberFormat ve printf” dersi ücretsiz mi?
Evet — “NumberFormat ve printf” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve Java Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. Java Academy kursu toplamda 4 dersten oluşur.
“NumberFormat ve printf” dersinde ne öğreneceğim?
NumberFormat, DecimalFormat ve printf kalıplarını kullanarak sayıları görüntüleme amacıyla biçimlendirin. Java Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.
Java Academy öğrenmeye başlamak için deneyim gerekli mi?
Önceden deneyim gerekmez. CoddyKit'te Java Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 4. dersidir.
“NumberFormat ve printf” dersi ne kadar sürer?
Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.
Bu Java Academy dersinde kod yazıp çalıştırabilir miyim?
Evet. Her Java Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.
Bu kursun tüm dersleri
- Math Sınıfının Temelleri
- Tamsayı Aritmetiği ve Taşma
- Finansal Hesaplamalar için BigDecimal
- NumberFormat ve printf