Sayıların Biçimlenmesi
Önceki VII. Oylum - Yereller ve Uluslararasılaştırma Sonraki
Sayıların Biçimlenmesi
Gerek localeconv ile dönen yapı ile gerekse nl_langinfo işlevine sembol belirterek sayısal ve parasal gösterimleri biçimlemekte kullanılan yerele özgü bilgilerin çeşitli parçalarının elde edilebileceğini görmüştük. Ayrıca temel kuralların oldukça karmaşık olduğunu da görmüştük.
Bu nedenle, X/Open standartları bu tür yerel bilgisini kullanan ve sayıları bu kurallara göre biçimlemeyi kullanıcı açısından kolaylaştıran bir işlev tanımlamıştır.
ssize_t strfmon
(char       *tampon,
 size_t      azamiboyut,
 const char *biçim,
 …)
işlev
strfmon işlevi strftime işlevine benzer. İşlev bir tampon, tampon boyu ve biçim dizgesi alır ve çıktı biçim dizgesi ile belirtildiği gibi biçimlenerek metin olarak tampona yazılır. İşlev, strftime gibi tampona yazılan baytların sayısı ile döner.
İki fark vardır: strfmon birden fazla argüman alır ve şüphesiz biçim belirtimi farklıdır. strftime'a benzer olarak, biçim dizgesi çıktıda olduğu gibi normal metindir ve biçim belirteçleri % işareti ile belirtilir. printf işlevinde olduğu gibi, % işaretinin ardından, biçim karakterinden önce isteğe bağlı olarak çeşitli seçenekler ve biçimleme bilgileri belirtilebilir:
  • % işaretinin hemen ardından bu seçeneklerden biri veya birkaçı belirtilebilir:
    =f
    f karakteri, sayısal dolgu karakteri olarak bu alanda kullanılacak tek baytlık karakterdir. Bu karakterin öntanımlı değeri boşluk karakteridir. Bu karakterin dolgu karakteri olarak kullanılabilmesi için ondalık ayracın solundaki bölüm için genişlik belirtilmiş olmalıdır. Belirtilen alan genişliği dolgu karakteri sayısı değildir.
    ^
    Seçili yerelin kurallarına bağlı rakam gruplaması yapılmaz. Öntanımlı olarak yerelde belirtilmiş gruplama yapılır.
    +
    (
    Bu seçeneklerden sadece biri kullanılabilir. Para miktarında işaretin nasıl belirtileceğini belirlerler. Öntanımlı olarak ve + belirtilmişse +/- için yerelde belirtilen kullanılır. ( belirtilmişse, negatif miktarlar parantez içine alınır. Tam biçim yazılımın çalışması sırasında seçili yerelin LC_MONETARY kategorisindeki değerlere göre saptanır.
    !
    Çıktı para sembolünü içermeyecektir.
    -
    Çıktı eğer alan genişliğinde doldurma yapılacağı belirtilmemişse sağa değil sola yanaşık biçimlenecektir.
Belirtimin sonraki parçası isteğe bağlı olan alan genişliğidir. Bir genişlik belirtilmemişse 0 verilmiş kabul edilir. Çıktılama sırasında, işlev önce ne kadar alan gerektiğini saptar. Eğer gerektiği kadar genişlik belirtilmişse çıktı bu alanı kullanır. Aksi takdirde, belirtilen genişlik dolgu karakteri ile doldurularak çıktılama yapılır. - iminin varlığına vaya yokluğuna bağlı olarak işaretin bulunduğu tarafın boşluğu saptanır. Varsa, çıktı sola yanaşık yapılarak boşluk sağa eklenir ya da tersi yapılır.
Şimdiye kadar printf ve strftime biçimlerine benzerliğinden dolayı biçim oldukça bildik göründü. Ancak sonraki iki alan biraz yeni. İlki # karakteri ile başlayan bir ondalık sayı dizgesidir. Bu dizge ondalık ayracın solunda kalan rakam (karakter sayısını değil) sayısını belirtir. Bu miktara gruplama karakterleri dahil değildir. Basılacak sayının rakamları bu genişliği dolduramazsa, boş kalan alan = imi ile belirtilmişse o karakterle aksi takdirde boşluk karakteri ile doldurulur. Örneğin alan genişliği 6 ve dolgu karakteri * olarak verilmişse, 123 sayısı, ***123 olarak biçimlenecektir.
İsteğe bağlı ikinci alan ise . karakteri ile başlayan bir ondalık sayı dizgesidir. Bu dizge ondalık ayracın sağındaki rakam sayısını belirtir. Öntanımlı değer yerelin frac_digits ve int_frac_digits değerleridir (bkz. Soysal Sayısal Biçimleme Parametreleri). Eğer belirtilen genişlik bütün haneleri göstermek için yeterli değilse, yuvarlama yapılır. Alan genişliği sıfır olarak belirtilmişse ondalık ayraç basılmaz.
Bir GNU oluşumu olarak GNU C kütüphanesindeki strfmon gerçeklemesi bu seçeneklerden sonra isteğe bağlı L biçim belirtecini kabul eder. Eğer bu belirteç varsa, belirtilen argüman bir double değer değil long double değer kabul edilir.
Son eleman bir biçim belirtecidir. Üç belirteç belirtilebilir:
i
Bir uluslararası parasal değerin biçimlenmesi için yerelin kuralları kullanılır.
n
Bir ulusal parasal değerin biçimlenmesi için yerelin kuralları kullanılır.
%
Çıktıya % işareti basılır. Sadece %% belirtilebilir, bir im, seçenek ya da belirteç belirtilmesine izin verilmemiştir.
printf işlevinin yaptığı gibi, işlev biçim dizgesini soldan sağa okur ve biçim dizgesinden sonra verilmiş olan değerleri bu dizgeye göre biçimlendirir. Değerler L belirteci varsa long double, aksi takdirde double türünde kabul edilir. Sonuç, tampon ile gösterilen tamponda en fazla azamiboyut karakterlik saklanır.
İşlevin dönüş değeri tampon'da saklanan boş karakter sonlandırmalı dizgenin karakter sayısıdır. Eğer tampon içinde saklanacak karakterlerin sayısı azamiboyut'tan büyükse tamponun yetersiz kaldığını belirtmek için işlev -1 ile döner. Bu durumda errno değişkenine E2BIG değeri atanır.
Küçük bir kaç örnekle işlevin nasıl çalıştığını gösterebiliriz. Örneklerin ABD yerelinde (en_US) çalıştırıldığı varsayılmıştır. En basit biçim:
strfmon (buf, 100, "@%n@%n@%n@", 123.45, -567.89, 12345.678);
için şu çıktı üretilir:
"@$123.45@-$567.89@$12,345.68@"
Burada birkaç şeyden bahsedebiliriz. İlki çıktılanan sayılardaki genişlik farklarıdır. Biçim dizgesinde bir genişlik belirtmedik, yani bunun önemi yok. İkincisi, üçüncü sayı binlik gruplama ayracı ile çıktılandı. Binlik gruplama ayracı en_US yereli için virgüldür. Bundan başka sayının yuvarlatıldığını görüyoruz. Biz ondalık ayracın sağındaki hane sayısını belirtmedik ama yerel bunu 2 olarak belirlediğinden .678 -> .68 olarak yuvarlandı. Son olarak i değil n belirtttiğimizden ulusal para sembolü görüntülendi.
Bu örnekte çıktının nasıl hizalandığı gösterilmiştir:
strfmon (buf, 100, "@%=*11n@%=*11n@%=*11n@", 123.45, -567.89, 12345.678);
Çıktısı şöyle olur (@ karakterlerine dikkat):
"@    $123.45@   -$567.89@ $12,345.68@"
Burada iki şeyden söz edilebilir: İlki, biçim dizgesinde alan genişliği belirtildiğinden ve bu genişlikten daha geniş bir sayı olmadığından tüm alanlar aynı genişlikte çıktılandı (onbir karakter). İkinci önemli nokta ise dolgu karakteri belirtildiği halde çıktıda kullanılmamış olmasıdır. Bunun sebebi, # karakteri ile ondalık noktanın solundaki alan genişliğinin verilmemiş olmasıdır; bu nedenle öntanımlı olarak boşluk kullanılmıştır. Aşağıdaki örnekte bu genişlik belirtilmiştir:
strfmon (buf, 100, "@%=*11#5n@%=*11#5n@%=*11#5n@",
         123.45, -567.89, 12345.678);
Çıktısı:
"@ $***123.45@-$***567.89@ $12,456.68@"
Görüldüğü üzere para sembolleri hizalandı ve para sembolü ile sayı arasındaki alan dolgu karakteri ile dolduruldu. Genişlik 5 seçildiğinden 123.45 için ondalik ayracın solundaki rakam sayısı bu değerden küçük olduğundan (5 e değil 11 karaktere tamamlanacak şekilde) artan alan yıldızlarla doldurulmuştur. Son sayıda ise binler ayracının genişliğe dahil olmadığı kanıtlanmaktadır. Son bir örnekle kalan işlevselliği açıklayalım:
strfmon (buf, 100, "@%=0(16#5.3i@%=0(16#5.3i@%=0(16#5.3i@",
         123.45, -567.89, 12345.678);
Bu karmaşık biçim dizgesi şu çıktıyı üretir:
"@ USD 000123,450 @(USD 000567.890)@ USD 12,345.678 @"
Burada en önemli değişiklik negatif sayıları göstermekte kullanılan yöntemdir. Finansal çevrelerde bu çoğunlukla parantezler kullanılarak yapılır ve bu ( imi ile seçilir. 0 karakterleri burada sayı için anlamlı haneler olmadıklarından bunlar arasında binler ayracı kullanılmamıştır. Biçim belirteci olarak n değil, i kullandığımızdan uluslararası para sembolü görüntülendi. Bu dört karakterlik ("USD ") bir dizgedir. Son nokta ise, ondalik ayracın sağındaki hane sayısı 3 olarak belirtildiğinden ilk iki sayıda sağa birer sıfır eklenirken, 3. sayıda yuvarlama yapılmamıştır.
Önceki Üst Ana Başlık Sonraki
Yerel Verisine Noktasal Erişim Başlangıç Evet/Hayır Yanıtları
Bir Linux Kitaplığı Sayfası