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

Adanali

Member


  1. 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”.

Genişlik ve hassasiyet


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>&#13;
#include <iostream>&#13;
#include <string>&#13;
&#13;
int main() {&#13;
&#13;
int i = 123456789;&#13;
double d = 123.456789;&#13;
&#13;
std::cout << "---" << std::format("{}", i) << "---n";&#13;
std::cout << "---" << std::format("{:15}", i) &#13;
<< "---n"; // (w = 15)&#13;
std::cout << "---" << std::format("{:}", i) &#13;
<< "---n"; // (w = 15) // (1)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "---" << std::format("{}", d) << "---n"; &#13;
std::cout << "---" << std::format("{:15}", d)&#13;
<< "---n"; // (w = 15)&#13;
std::cout << "---" << std::format("{:}", d) &#13;
<< "---n"; // (w = 15)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::string s= "Only a test";&#13;
&#13;
std::cout << "---" << std::format("{:10.50}", d) &#13;
<< "---n"; // (w = 10, p = 50) // (2)&#13;
std::cout << "---" << std::format("{:{}.{}}", d, 10, 50)&#13;
<< "---n"; // (w = 10, p = 50) // (3)&#13;
&#13;
std::cout << "---" << std::format("{:10.5}", d) &#13;
<< "---n"; // (w = 10, p = 5)&#13;
std::cout << "---" << std::format("{:{}.{}}", d, 10, 5)&#13;
<< "---n"; // (w = 10, p = 5)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << "---" << std::format("{:.500}", s) &#13;
<< "---n"; // (p = 500) // (4)&#13;
std::cout << "---" << std::format("{:.{}}", s, 500) &#13;
<< "---n"; // (p = 500) // (5)&#13;
std::cout << "---" << std::format("{:.5}", s) &#13;
<< "---n"; // (p = 5)&#13;
&#13;
}


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&#13;
&#13;
#include <format>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
double doub = 123.456789;&#13;
&#13;
std::cout << std::format("{:}n", doub); // (1)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
for (auto precision: {3, 5, 7, 9}) {&#13;
std::cout << std::format("{:.{}}n", &#13;
doub,&#13;
precision); // (2)&#13;
}&#13;
&#13;
std::cout << 'n';&#13;
&#13;
int width = 10;&#13;
for (auto precision: {3, 5, 7, 9}) {&#13;
std::cout << std::format("{:{}.{}}n",&#13;
doub, &#13;
width, &#13;
precision); // (3)&#13;
}&#13;
&#13;
std::cout << 'n';&#13;



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.








Veri tipi


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;&#13;
&#13;
std::format("{}", &d); // ERROR&#13;
std::format("{}", static_cast<void*>(&d)); // okay&#13;
std::format("{}", static_cast<const void*>(&d)); // okay&#13;
std::format("{}", nullptr); // okay


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


// formatType.cpp&#13;
&#13;
#include <format>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
int num{2020};&#13;
&#13;
std::cout << "default: " << std::format("{:}", num)&#13;
<< 'n';&#13;
std::cout << "decimal: " << std::format("{:d}", num) &#13;
<< 'n';&#13;
std::cout << "binary: " << std::format("{:b}", num)&#13;
<< 'n';&#13;
std::cout << "octal: " << std::format("{:eek:}", num) &#13;
<< 'n';&#13;
std::cout << "hexadecimal: " << std::format("{:x}", num) &#13;
<< 'n';&#13;
&#13;
}








Sıradaki ne?


Ş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
 
Üst