0Pricing
Java Academy · Ders

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.57

Geniş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-00000042

Para 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.89

Yü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.235E8

Dizelerden 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.567

Fatura 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.format ile yanlış tür belirteci kullanmak (örneğin bir double için %d kullanmak) IllegalFormatConversionException oluş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 ThreadLocal kullanı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 instance

Hı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

  1. Math Sınıfının Temelleri
  2. Tamsayı Aritmetiği ve Taşma
  3. Finansal Hesaplamalar için BigDecimal
  4. NumberFormat ve printf
← Java Academy Sayfasına Dön