C# Yazı Biçimlendirme
Yazı Biçimlendirme
Bildiğiniz gibi C# dilinde decimal tipte bir m değişkeni şu şekilde
yazıya dönüştürülür.
using System;
class YaziBicimlendirme
{
static void Main()
{
double d = 23.45;
string s = d.ToString();
Console.WriteLine(s);
}
}
ToString metodunun kullanımı burada göründüğünden biraz fazla
esnektir. .net Framework, sayısal türleri yazıya dönüştürürken
istediğimiz biçimde biçimlendirip gösterme imkânı sunar. Meselâ:
using System;
class YaziBicimlendirme
{
static void Main()
{
double d = 23.45;
//string s = d.ToString();
string s = d.ToString("G");
Console.WriteLine(s);
}
}
Buradaki Gnin anlamı (General) Genel formatlamadır. Varsayılan
değer zaten G olduğu için yazmayabilirsiniz. Bu durumda yukarıdaki
her iki örneğin de yapığı iş aynıdır. Farklı bir formatlama için
tablodaki harfleri kullanabilirsiniz. Tablodaki harfleri büyük ya da
küçük harfle yazmak fark etmiyor.
Harf
Anlamı
Açıklama
C
Currency
Para birimleri ile birlikte kullanılır. Üçer basamak ayırır.
D
Decimal
Sadece integer değerler için.
E
Exponential
Bilimsel gösterim için kullanılır.
F
Fixed Point
Sayının bilimsel olmayan gösterimde gösterilmesini sağlar.
G
General
Üstel ve noktalı değerlerin çok küçük olduğu yerlerde.
N
Number
F ile aynıdır. Üçer basamak ayırır.
P
Percent
Yüzde ifadeleri için kullanılır. Sayı 100e bölünür, üçer basamak
ayırır ve % işareti gösterilir.
R
Roundtrip
Kayar nokta türler için kullanılır. Parse yöntemi ile geri
dönüştürülebilecek bir string oluşturur.
X
Hexadecimal
Tamsayı değerleri hexadecimal olarak gösterir.
Burada dokuz tane formatlama biçimi var. Bir tanesi için örnek
verelim. m 0,123 değerini tutuyorsa aşağıdaki programın çıktısı
%12,30 olacaktır.
using System;
class YaziBicimlendirme
{
static void Main()
{
double d = 0.123;
string s = d.ToString("P");
Console.WriteLine(s);
}
}
C formatlama özelliği para sembolü göstermek için kullanılır. Bu
sembol mutlaka dolar işareti olmak zorunda değildir. Bölge ve dil
seçeneklerine göre değişir. Ama biz özellikle bir para birimin
göstermek istiyorsak, meselâ dolar işareti göstermek istiyorsak
aşağıdaki gibi yazmalıyız.
m.ToString (N) + $
İsterseniz harften sonra rakamda kullanabilirsiniz. Meselâ;
m.ToString (P5)
Buradaki rakamın anlamı yanındaki harfe göre değişiklik
gösterebilir. Aşağıdaki tabloda ToString metodu ile sayıların nasıl
kullanıldığı gösteriliyor.
Harf
Anlamı
Yazılacak Sayının Sonuca Etkisi
C
Currency
Virgülden sonra gösterilecek basamak sayısı (Varsayılan değer 2)
D
Decimal
Gösterilecek basamak sayısı (Eğer eksik olursa başına 0 eklenir.)
E
Exponential
Virgülden sonra gösterilecek basamak sayısı (Varsayılan değer 6)
F
Fixed Point
Virgülden sonra gösterilecek basamak sayısı (Varsayılan değer 2)
G
General
Gösterilecek basamak sayısı.
N
Number
Virgülden sonra gösterilecek basamak sayısı (Varsayılan değer 2)
P
Percent
Virgülden sonra gösterilecek basamak sayısı (Varsayılan değer 2)
R
Roundtrip
Kullanılmaz
X
Hexadecimal
Gösterilecek basamak sayısı (Eğer eksik olursa başına 0 eklenir)
Bir örnekle decimal tipteki bir değişkenin bütün formatlama
çeşitlerini inceleyelim.
using System;
class NumerikFormatlama
{
static void Main()
{
decimal m = 12345.345m;
Console.WriteLine("Para formatında: " + m.ToString("C2"));
Console.WriteLine("Üstel formatta: " + m.ToString("E2"));
Console.WriteLine("Sabit noktalı formatta: " + m.ToString("F2"));
Console.WriteLine("Genel formatta: " + m.ToString("G2"));
Console.WriteLine("Sayı formatında: " + m.ToString("N2"));
Console.WriteLine("Yüzde formatında: " + m.ToString("P2"));
}
}
ToString yöntemi bölge ve dil seçeneklerine göre farklı sonuçlar
verebilen esnek parametrelere sahiptir. Programınız hiçbir
değişiklik yapmadan seçili bölge ve dil seçenekleri doğrultusunda
uygun sonuçlar üretebilmektedir. Türkiye için seçili ayarlar
doğrultusunda programın sonucu aşağıdaki gibi olacaktır.
Yukarıda görülen ekran çıktısı incelenirse yuvarlama işlemleri var.
Ama bu yuvarlama işlemleri Round yönteminin kurallarından daha
farklı yapılmıştır. İki sayı arasındaki bir değer yuvarlanacaksa
yukarı yuvarlanmıştır. 12345.345 sayısı 12345.34 olarak yuvarlanması
gerekirken yukarı yuvarlanmış ve 12345.35 olarak yuvarlanmıştır.
Eğer bu sizin işinizi görmüyorsa ToString işleminden önce Round ile
yuvarlayınız.
Aşağıdaki örnekte 12345 tamsayısı sayısı hexadecimal sayıya
dönüştürülmektedir.
using System;
class NumerikFormatlama
{
static void Main()
{
int i = 12345;
string s = i.ToString("X8");
Console.WriteLine(s);
}
}
Burada 00003039 sayısı üretilir ve kısaltma sözkonusu değildir, 8
basamağa tamamlamak için başına dört tane 0 eklenmiştir. Ama
aşağıdaki örnekte virgülden sonrası için 2 basamak belirtildiği için
duyarlılık kaybı olacaktır.
using System;
class NumerikFormatlama
{
static void Main()
{
int i = 12345;
string s = i.ToString("E2");
Console.WriteLine(s);
}
}
Ekranda Console.WriteLine ile birden çok sayı gösterecekseniz bu
durumda string birleştirme işleminden yararlanabilirsiniz. String
birleştirme işlemini string veri türü yazısında daha önce örneklerle
görmüştük.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4;
Console.WriteLine(A + " ve " + B + " sayıları toplamı "
+ (A + B) + " eder.");
}
}
Yukarıdaki örnekte gördüğünüz gibi karmaşık bir yazı şekli oldu.
Bunun daha güzel bir şekli vardır. Bu da yer belirtme yöntemidir.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4;
Console.WriteLine("{0} ve {1} sayıları toplamı {2} eder",
A, B, A + B);
}
}
Yukarıdaki örnekte WriteLine yöntemi dört tane parametre almıştır.
İlk parametre ekranda gösterilecek olan string ifadedir. Bu string
ifade içersinde yer tutucular var ve dizilerde olduğu gibi 0 ile
başlamıştır, küme parantezleri arasında belirtilmiştir. Bu yer
tutucular gösterilecek olan string ifadeyi takip eden virgülle
ayrılmış diğer üç tane parametre için yer belirtmektedir. {0} ile
belirtilen yere A değişkeninin değeri, {1} ile belirtilen yere B
değişkeninin değeri, {2} ile belirtilen yere de A+B işleminin sonucu
gelecektir. İlk parametreden sonra belirtilecek parametreler sayısal
ifadeler olabileceği gibi string ifadeler, string literaller de
olabilir.
Eğer yazının içerisinde küme parantezi geçecekse bunu ardı ardına
iki tane kullanarak yapmalıyız.
Bu yer tutucuları yazı içerisinde sıra ile yazmak zorunda değiliz.
Nerede bulunmaları gerekiyorsa oraya koyabiliriz. Aşağıdaki örnekte
yer tutucular {0} {1} {2} sırasıyla yazılmamıştır.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4;
Console.WriteLine("{2} değeri {0} ve {1} sayılarının toplamıdır.",
A, B, A + B);
}
}
İlk parametre olan string ifadeden sonra yazacağımız parametre
sayısı yer tutuculardan fazla olabilir. Bir parametreyi yazmışsak ve
onun için yer tutucu belirtmemişsek problem olmaz.
Aşağıdaki örnekte yazılan C parametresi hiç kullanılmamıştır ama
programın çalışması için bir engel teşkil etmez.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4, C = 20;
Console.WriteLine("{2} değeri {0} ve {1} sayılarının toplamıdır.",
A, B, A + B, C);
}
}
Aşağıdaki örnekte olduğu gibi 4 tane parametre düşünelim. 0, 1 ve 3
numaralı parametreleri kullanacağız ve 2 numaralı parametre hiç
kullanılmayacak. Böyle bir kullanım da mümkündür. Kullanılmayacak
olan parametrenin en son yazılma zorunluluğu da yoktur.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4, C = 20;
Console.WriteLine("{3} değeri {0} ve {1} sayılarının toplamıdır.",
A, B, C, A + B);
}
}
Bir yer tutucuyu tekrar tekrar kullanmak da mümkündür.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4, C=20;
Console.WriteLine("{3} değeri {0} ve {1} sayılarının toplamıdır.
Sonu\u231 ? {3} değeridir.",
A, B, C, A + B);
}
}
Ama olmayan bir parametre için yer tutucu yazmak doğaldır ki
yanlıştır ve bir istisna ortaya çıkacaktır.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4, C = 20;
Console.WriteLine("{0} ve {1} sayıları toplamı {3} eder",
A, B, A + B);
}
}
Yukarıda string birleştirme işlemi ile yazdığımız örneği bir defa
daha yazalım ama açık ToString yöntem çağruları ile biçimlendirme de
yapalım.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4;
Console.WriteLine(A.ToString("E4") + " ve " +
B.ToString("E4") + " sayıları toplamı "
+ (A + B).ToString("E4") + " eder.");
}
}
Karmaşık oldu, yer tutucular kullanarak yazalım.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4;
Console.WriteLine("{0} ve {1} sayıları toplamı {2} eder",
A.ToString("E4"), B.ToString("E4"), (A + B).ToString("E4"));
}
}
Ama gene karmaşık oldu. Daha güzel bir yöntem var. Sayısal
biçimlendirme parametrelerini yer tutucularla birlikte yazabiliriz.
Açık ToString yöntem çağrılarına da gerek kalmaz.
using System;
class NumerikFormatlama
{
static void Main()
{
int A = 3, B = 4;
Console.WriteLine("{0:E4} ve {1:E4} sayıları toplamı {2:E4} eder",
A, B, A + B);
}
}
Yer tutucu numarası bir iki nokta işareti ve ardından biçimlendirme
parametresi geliyor. Bu parametreler normalde ToString yöntemine
geçiliyor, ama bu şekilde kullanım çok daha pratik olduğu için daha
çok tercih ediliyor.
Çoğu durumda bir ifadenin karakter olarak ne kadar yer kaplayacağını
bilmek imkânsızdır, meselâ tamsayılar 10 karaktere kadar, eğer
negatif değer alabiliyorlarsa 11 karaktere kadar, üçer basamak
ayrılıyorsa 4 karaktere kadar yer kaplayabilirler. Aşağıdaki örnekte
sayılar iç içe geçmektedir.
Console.WriteLine("{0}{1}{2}{3}", A, B, C, D);
Bunu kolaylıkla aralarına boşluklar bırakarak ayırabiliriz.
Console.WriteLine("{0} {1} {2} {3}", A, B, C, D);
Alt alta birden çok WriteLine değeri yazdığımızı düşünürseniz
belirli yerler kaplayarak sütunlar halinde alt alta yazılmasını
isteyebiliriz. Alan genişliği denilen sayılar yazarak ne kadar yer
kaplayacaklarını belirtebiliriz, bunu da yer tutucu numaraların
yanına virgül koyup akabinde alan genişliği değerini giriyoruz.
using System;
class NumerikFormatlama
{
static void Main()
{
decimal mA = 123.45m;
string strB = "Kitap";
int iC = 12;
decimal mD = 456678m;
Console.WriteLine("{0,10}{1,15}{2,10}{3,20}", mA, strB, iC, mD);
}
}
mA sayısı sağa dayalı olarak 10 karakter, strB değeri yine sağa
dayalı olarak 15 karakter, iC değeri yine sağa dayalı olarak 10
karakter, mD değeri yine sağa dayalı olarak 20 karakter yer
kullanılarak gösterildi.
Çıktısı da aşağıdaki şekildedir.
Konsolda bir satırda gösterebileceğimiz karakter sınırı da yine IBM
punch kartlarındaki sınır olan 80 karakterdir.
Biçimleme parametreleri ile alan genişliği parametrelerini birlikte
kullanabilirsiniz.
using System;
class NumerikFormatlama
{
static void Main()
{
decimal mA = 123.45m;
string strB = "Kitap";
int iC = 12;
decimal mD = 456678m;
Console.WriteLine("{0,-15}{1,10:C2}{2,10:X5}{3,20:E3}", strB, mA, iC,
mD);
}
}
Yukarıdaki örnekte {0} yer tutucusunun gösterdiği değer dikkat
ederseniz alan genişliği olarak -15 değerini almıştır. Bu da 15
karakterlik alanda soldan hizalama yapılacağı anlamına gelmektedir.
Hem biçimlendirme hem de alan belirleme parametreleri birlikte
kullanıldı.
|