C++20 Biçimlendirme Kitaplığı: Dize ayrıntılarını biçimlendirme

Son makalem olan “C++20’deki Biçimlendirme Kitaplığı: Biçim Dizesi”nde biçim dizesi biçiminin bazı özelliklerini tanıttım. Bugün bu konudaki makaleyi bitiriyorum.

Duyuru

Rainer Grimm uzun yıllardır yazılım mimarı, ekip ve eğitim yöneticisi olarak çalışmaktadır. C++, Python ve Haskell programlama dilleri üzerine makaleler yazmaktan hoşlanıyor, aynı zamanda özel konferanslarda sık sık konuşmaktan da hoşlanıyor. Modern C++ adlı blogunda C++ tutkusunu yoğun bir şekilde ele alıyor.

Bugünkü yazımda format spesifikasyonunun genişliği, hassasiyeti ve veri tipi hakkında yazacağım. Kimlik, dolgu, hizalama, işaretler ve alternatif şekil hakkında daha fazla bilgi edinmek istiyorsanız önceki makalemi okuyun: “C++20’deki Biçimlendirme Kitaplığı: Biçim Dizesi”.

Bir konunun genişliğini ve kesinliğini belirleyebilirsiniz. Sayılara genişlik uygulanabilir ve kayan nokta sayılarına ve dizelere hassasiyet uygulanabilir. Kayan noktalı sayılar için kesinlik, biçimlendirmenin kesinliğini gösterir; Dizeler için hassasiyet, kaç karakterin kullanıldığını ve dizenin nasıl kesildiğini gösterir. Hassasiyet dizenin uzunluğundan büyükse dize üzerinde hiçbir etkisi yoktur.

  • Genişlik: Pozitif bir ondalık sayı veya bunun yerine bir alan kullanabilirsiniz ({} VEYA {n}) kullanmak. Belirtilmişse verir n minimum genişlik.
  • Hassasiyet: Nokta (.) ve ardından negatif olmayan bir ondalık sayı veya değiştirme alanı kullanabilirsiniz.

Bazı örnekler temelleri anlamanıza yardımcı olacaktır:

// formatWidthPrecision.cpp

#include <format>
#include <iostream>
#include <string>

int main() {

    int i = 123456789;
    double d = 123.456789;

    std::cout << "---" << std::format("{}", i) << "---n";
    std::cout << "---" << std::format("{:15}", i) 
      << "---n"; // (w = 15)
    std::cout << "---" << std::format("{:}", i) 
      << "---n";   // (w = 15)                             // (1)

    std::cout << 'n';

    std::cout << "---" << std::format("{}", d) << "---n";    
    std::cout << "---" << std::format("{:15}", d)
      << "---n"; // (w = 15)
    std::cout << "---" << std::format("{:}", d) 
      << "---n";   // (w = 15)

    std::cout << 'n';

    std::string s= "Only a test";

    std::cout << "---" << std::format("{:10.50}", d) 
      << "---n"; // (w = 10, p = 50)                        // (2)
    std::cout << "---" << std::format("{:{}.{}}", d, 10, 50)
      << "---n";  // (w = 10, p = 50)                       // (3)
                                      
    std::cout << "---" << std::format("{:10.5}", d) 
      << "---n";  // (w = 10, p = 5)
    std::cout << "---" << std::format("{:{}.{}}", d, 10, 5)
      << "---n";  // (w = 10,  p = 5)

    std::cout << 'n';

    std::cout << "---" << std::format("{:.500}", s) 
      << "---n";      // (p = 500)                          // (4)
    std::cout << "---" << std::format("{:.{}}", s, 500) 
      << "---n";  // (p = 500)                              // (5)
    std::cout << "---" << std::format("{:.5}", s) 
      << "---n";        // (p = 5)

}

THE w-kaynak kodundaki karakter genişliği temsil eder; aynı şekilde p-Doğruluk için imzalayın.

Programla ilgili bazı ilginç gözlemler şunlardır: Genişlik bir değiştirme alanıyla (1) belirtildiğinde ekstra boşluk eklenmez. Ekranın uzunluğundan daha büyük bir hassasiyet kullanıldığında double (2 ve 3), görüntülenen değerin uzunluğu kesinliği yansıtır. Bu gözlem bir dizi (4 ve 5) için geçerli değildir.

Ayrıca genlik ve hassasiyet parametrelendirilebilir.

// formatWidthPrecisionParametrized.cpp

#include <format>
#include <iostream>

int main() {

    std::cout << 'n';

    double doub = 123.456789;

    std::cout << std::format("{:}n", doub);  // (1)

    std::cout << 'n';

    for (auto precision: {3, 5, 7, 9}) {
       std::cout << std::format("{:.{}}n", 
                                doub,
                                precision);   // (2)
    }

    std::cout << 'n';

    int width = 10;
    for (auto precision: {3, 5, 7, 9}) {
       std::cout << std::format("{:{}.{}}n",
                                doub, 
                                width, 
                                precision);   // (3)
    }
    
    std::cout << 'n';

program formatWidthPrecisionParametrized.cpp çifti temsil eder doub farklı yollarla. (1) varsayılan ayarı uygulayın. (2) kesinlik 3’ten 9’a kadar değişir. Biçim dizisinin son argümanı içeri girer {} biçim belirticinin {:.{}}. Son olarak (3)’te görüntülenen double değerlerin genişliği 10 olarak ayarlanmıştır.

Tipik olarak derleyici, kullanılan değerin türünü çıkarır. Ancak bazen veri türünü belirtmek istersiniz. Bunlar ana veri türleridir:

Teller: s

Bütün sayılar:

  • b: ikili biçim
  • B: Gibi bancak temel önek 0B
  • d: ondalık format
  • o: sekizlik format
  • x: onaltılı format
  • X: Gibi xancak temel önek 0X

char VE wchar_t:

  • b, B, d, o, x, X: tamsayılar gibi

bool:

  • s: true VEYA false
  • b, B, d, o, x, X: tamsayılar gibi

Kayan nokta sayıları:

  • e: üstel format
  • E: Gibi eancak üs birliktedir E yazılı
  • f, F: Sabit nokta; hassasiyet 6’dır
  • g, G: Hassasiyet 6, ancak üs şu şekildedir: E yazılı

Işaretçi:

  • p: adresinin onaltılık gösterimi

Yalnızca veri türleri void, const void VE std::nullptr_t Geçerlidirler. Herhangi bir işaretçinin adresini görüntülemek istiyorsanız onu girmelisiniz (const) void* dönüştürmek.

double d = 123.456789;

std::format("{}", &d);                           // ERROR
std::format("{}", static_cast<void*>(&d));       // okay
std::format("{}", static_cast<const void*>(&d)); // okay
std::format("{}", nullptr);                      // okay

Veri türleriyle bir tane yapabilirsiniz int basitçe farklı bir sayı sisteminde temsil edin.

// formatType.cpp

#include <format>
#include <iostream>

int main() {

    int num{2020};

    std::cout << "default:     " << std::format("{:}", num)
      << 'n';
    std::cout << "decimal:     " << std::format("{:d}", num) 
      << 'n';
    std::cout << "binary:      " << std::format("{:b}", num)
      << 'n';
    std::cout << "octal:       " << std::format("{:o}", num) 
      << 'n';
    std::cout << "hexadecimal: " << std::format("{:x}", num) 
      << 'n';

}

Şu ana kadar temel veri türlerini ve dizelerini biçimlendirdim. Elbette özel türleri de biçimlendirebilirsiniz. Bir sonraki yazımın konusu bu olacak.


(kendim)

Haberin Sonu

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir