Pure Java – 64 Dates, Numbers & Currency – NumberFormat & Currency & DecimalFormat

Merhaba Arkadaslar, Bu yazimda java.text.NumberFormat , java.text.DecimalFormat ve java.util.Currency siniflarini inceleyecegiz. java.text.NumberFormat sinifi da java.text.DateFormat Sinifi gibi abstract bir siniftir.

public abstract class NumberFormat extends Format { ... }

DateFormat sinifinda oldugu gibi benzer sekilde getInstance veya getNumberInstance metodundan yararlaniriz. getInstance ve getNumberInstance  ayni ise yaramaktadir. Bu metotlarin overloaded versiyonlari da vardir. Ornegimizde kullanacagiz.

    /**
     * Returns a general-purpose number format for the current default locale.
     * This is the same as calling
     * {@link #getNumberInstance() getNumberInstance()}.
     */
    public final static NumberFormat getInstance() {
        return getInstance(Locale.getDefault(), NUMBERSTYLE);
    }

    /**
     * Returns a general-purpose number format for the current default locale.
     */
    public final static NumberFormat getNumberInstance() {
        return getInstance(Locale.getDefault(), NUMBERSTYLE);
    }

Cagrilan ilgili overloaded getInstance metodunu incelersek varsayilan olarak geriye java.text.DecimalFormat tipinde bir obje dondugunu gorebiliriz.

public class DecimalFormat extends NumberFormat {...}

DecimalFormat IS-A NumberFormat iliskisi soz konusudur. Varsayilan/default Locale en_US tir ve sayi formati farkli Local degerine gore degiskenlik gosterebilir. Kod icerisinde aciklamalari inceleyelim.

import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

public class NumberFormatTest {

	public static void main(String[] args) {
		NumberFormat numberFormat = NumberFormat.getInstance();
		// getInstance() metodunda varsayilan olarak Locale.getDefault()
		// kullanilir.
		System.out.println(Locale.getDefault()); // en_US default locale dir.

		NumberFormat numberFormatTR = NumberFormat
				.getInstance(new Locale("TR"));
		// overloaded getInstance metodunu kullanarak kendimiz bir Locale
		// degerini verebiliriz.

		System.out.println(numberFormat instanceof DecimalFormat);
		// NOT : DecimalFormat IS-A NumberFormat tir !

		double salary = 123.456;
		System.out.println(numberFormat.format(salary));
		// Varsayilan locale icin yani en_Us icin kusuratli/floating-point
		// sayilar icin arada nokta (.) vardir.

		System.out.println(numberFormatTR.format(salary));
		// TR icin kusuratli/floating point sayilar icin arada virgul (,)
		// vardir.

		// ###Dikkat edecek olursak farkli Locale gore nokta veya virgul
		// olabilir.

	}
}

Kusuratli sayilari formatladigimiz gibi currency/para birimi icin de formatlama yapabiliriz. Bunun icin getCurrencyInstance metodunu kullanabiliriz. java.util.Currency sinifinda yer alan getCurrencyCode ve getSymbol metotlari ile de parabirimi kodu ve sembol bilgisine ulasabiliriz.

import java.text.NumberFormat;
import java.util.Currency;
import java.util.Locale;

public class NumberFormatCurrencyTest {

	public static void main(String[] args) {
		NumberFormat numberCurrencyFormat = NumberFormat.getCurrencyInstance();
		// Locale.getDefault() en_us oldugu icin $ olarak formatlayacaktir.

		NumberFormat numberCurrencyFormatGE = NumberFormat
				.getCurrencyInstance(Locale.GERMANY);
		NumberFormat numberCurrencyFormatIT = NumberFormat
				.getCurrencyInstance(Locale.ITALY);
		NumberFormat numberCurrencyFormatUK = NumberFormat
				.getCurrencyInstance(Locale.UK);
		NumberFormat numberCurrencyFormatJP = NumberFormat
				.getCurrencyInstance(Locale.JAPAN);
		NumberFormat numberCurrencyFormatTR = NumberFormat
				.getCurrencyInstance(new Locale("tr", "TR"));

		double salary = 123.456;
		System.out.println(numberCurrencyFormat.format(salary));
		System.out.println(numberCurrencyFormatGE.format(salary));
		System.out.println(numberCurrencyFormatIT.format(salary));
		System.out.println(numberCurrencyFormatUK.format(salary));
		System.out.println(numberCurrencyFormatJP.format(salary));
		System.out.println(numberCurrencyFormatTR.format(salary));

		String USDcode = Currency.getInstance(Locale.US).getCurrencyCode();
		String USDSymbol = Currency.getInstance(Locale.US).getSymbol();

		String GBPcode = Currency.getInstance(Locale.UK).getCurrencyCode();
		String GBPSymbol = Currency.getInstance(Locale.UK).getSymbol(Locale.UK);

		String EURcode = Currency.getInstance(Locale.GERMANY).getCurrencyCode();
		String EURSymbol = Currency.getInstance(Locale.GERMANY).getSymbol(
				Locale.GERMANY);

		System.out.println(USDcode + " " + USDSymbol);
		System.out.println(GBPcode + " " + GBPSymbol);
		System.out.println(EURcode + " " + EURSymbol);

	}
}

Simdi de NumberFormat sinifinda yer alan diger bazi metotlari inceleyelim.

getMaximumFractionDigits metodu virgulden sonra en fazla/maximum kactane deger olabilecegi bilgisini dondurur. Bu deger varsayilan olarak 3 tur.

getMinimumFractionDigits ise benzer durum icin minimum degeri dondurur bu deger 0(sifir) dir.

Ornegin ; 123.456789 sayisi virgulden sonra 6 rakamlidir fakat varsayilan maximum fraction 3tur. Bu durumda 123.457 olacaktir .Virgulden sonraki rakam 7 oldugu icin yukari yuvarlayacaktir. 5 ve uzeri icin yukari yuvarlama soz konusudur.

setMaximumFractionDigits metodunu kullanarak virgulden sonraki kullanilabielcek maximum rakam sayisini arttirabiliriz ya da setMinimumFractionDigits metodunu kullanarak kullanilmasi gereken minimum rakam sayisini ayarlayabiliriz.

Benzer sekilde setMaximumIntegerDigits ve setMinimumIntegerDigits metotlarini kullanarak virgulden once kullanilabilecek rakam sayisini duzenleyebiliriz.

import java.text.NumberFormat;

public class NumberFormatFractionTest {

	public static void main(String[] args) {
		NumberFormat numberFormat = NumberFormat.getInstance();

		int maxFractionDigits = numberFormat.getMaximumFractionDigits();
		// varsayilan olarak 3 tur
		int minFractionDigits = numberFormat.getMinimumFractionDigits();
		// varsayilan olarak 0 dir

		System.out.println("minimum fraction digits :" + minFractionDigits);
		System.out.println("maximum fraction digits :" + maxFractionDigits);

		double salary = 123.456789;
		System.out.println(salary);
		System.out.println(numberFormat.format(salary));

		numberFormat.setMaximumFractionDigits(5);
		// virgulden sonraki kullanilan rakam sayisi maximum 5 olsun.
		System.out.println(numberFormat.format(salary));

		double salary2 = 123;

		System.out.println(salary2); // double sayi icin tek 0 koyacaktir.

		numberFormat.setMinimumFractionDigits(2);
		// virgulden sonraki kullanilan rakam sayisi minimum 2 olsun.
		// eger yoksa 00 olarak ekleyecektir.
		System.out.println(numberFormat.format(salary2));

		numberFormat.setMaximumIntegerDigits(5);
		// virgulden once maximum 5 karakter olsun
		numberFormat.setMinimumIntegerDigits(3);
		// virgulden once minimum 3 karakter olsun.

		System.out.println(numberFormat.format(123456789));
		System.out.println(numberFormat.format(89));
	}
}

NumberFormat sinifinda yer alan format metodu integer/tamsayi ya da kayan noktali sayi literallerini String e donusturur. NumberFormat sinifinda yer alan parse metodu String degeri Number a donusturur. parse metodu ParseException firlatabilir.

import java.text.NumberFormat;
import java.text.ParseException;

public class NumberFormatParseTest {

	public static void main(String[] args) {
		NumberFormat numberFormat = NumberFormat.getInstance();

		// NumberFormat sinifinda yer alan parse metodu String degeri Number a
		// donusturur.
		// NumberFormat sinifinda yer alan format metodu integer/tamsayi ya da
		// kayan noktali sayi literallerini String e donusturur.

		// parse metodu ParseException firlatabilir.
		try {
			System.out.println(numberFormat.parse("123.456789"));
			
			numberFormat.setParseIntegerOnly(true);
			System.out.println(numberFormat.parse("123.456789"));
			
		} catch (ParseException e) {
			e.printStackTrace();
		}
	}
}

java.text.DecimalFormat sinifini kendi belirledigimiz ozellesmis pattern e gore sayilari formatlamak icin kullanabiliriz.

import java.text.DecimalFormat;
import java.text.DecimalFormatSymbols;

public class DecimalFormatTest {

	public static void main(String[] args) {

		DecimalFormat decimalFormat = new DecimalFormat("#,###.###");
		// 3 basamak arasinda virgul koyar. 123,456
		// kusuratli sayilar baslangici icin nokta.
		// kususattli 3 basamak olmali.

		DecimalFormat decimalFormat2 = new DecimalFormat("#,##.##");
		// 2 basamak arasina virgul koyar. 12,34,56

		DecimalFormat decimalFormat3 = new DecimalFormat("000000000.0000");
		// tam bu patterndeki rakam adedine ulasana kadar 0 ekler
		// 000123456.7890

		DecimalFormat decimalFormat4 = new DecimalFormat("$###,###.##");
		// dolar isareti koyduk.
		DecimalFormat decimalFormat5 = new DecimalFormat("\u00A5###,###.###");
		// yen isareti koyar.

		double salary = 123456.789;

		System.out.println(decimalFormat.format(salary));
		System.out.println(decimalFormat2.format(salary));
		System.out.println(decimalFormat3.format(salary));
		System.out.println(decimalFormat4.format(salary));
		System.out.println(decimalFormat5.format(salary));

		DecimalFormatSymbols symbols = new DecimalFormatSymbols();
		symbols.setDecimalSeparator(':');
		symbols.setGroupingSeparator(';');
		// dilersek kendimiz nokta ve virgul karekterlerini baska karakter
		// olacak sekilde degistirip formatlayabiliriz.

		DecimalFormat decimalFormat6 = new DecimalFormat("#,###.##", symbols);

		System.out.println(decimalFormat6.format(salary));

	}
}

Yazimi burada sonlandiriyorum.
Herkese Bol Javali Gunler dilerim.
Be an oracle man , import java.*;
Levent Erguder
OCP, Java SE 6 Programmer
OCE, Java EE 6 Web Component Developer

Print Friendly, PDF & Email

Leave a Reply

Your email address will not be published. Required fields are marked *