C ++ 20'deki biçimlendirme kitaplığı: Biçim dizisindeki ayrıntılar

Adanali

Active member
C ++ 20'deki biçimlendirme kitaplığı: Biçim dizisindeki ayrıntılar


  1. C ++ 20'deki biçimlendirme kitaplığı: Biçim dizisindeki ayrıntılar

Son makalemde “C ++ 20'deki Biçimlendirme Kitaplığı:” Biçim Halkası “Format format formatının bazı özelliklerini sundum. Bugün antlaşmayı bitirdim.










Rainer Grimm yıllardır yazılım mimarı, ekip ve eğitim müdürü olarak çalıştı. C ++ programlama dilleri, Python ve Haskell hakkında makaleler yazmayı seviyor, ancak uzman konferanslarla konuşmayı da seviyor. Modern C ++ blogunda, C ++ tutkusuyla yoğun bir şekilde ilgileniyor.













Bugünün makalesinde, formatın formatının genişliği, doğruluğu ve veri türü üzerine yazacağım. Kimlik konusu hakkında daha fazla bilgi edinmek istiyorsanız, doldurma dolguları, oryantasyon, işaretler ve alternatif formda, önceki makalemi okuyun: “C ++ 20'deki biçimlendirme kitaplığı: Biçim Yüzüğü”.

Genişlik ve hassasiyet


Bir konunun genişliğini ve doğruluğunu belirlemek mümkündür. Genişlik, mobil tepe sayıları ve dize zincirlerinde sayılara ve doğruluğa uygulanabilir. Mobil tepe sayıları durumunda, doğruluk biçimlendirmenin doğruluğunu gösterir; Şaşırtıcı zincirlerde, doğruluk kaç karakterin kullanıldığını ve sonunda karakterin zincirinin nasıl kesintiye uğradığını gösterir. Doğruluk dizenin uzunluğundan büyükse, bunun dize üzerinde bir etkisi yoktur.

  • Genişlik: Pozitif bir ondalık sayıya veya yedek alanınız olabilir ({} VEYA {n}) Kullanmak. Belirtilirse, ver n minimum genişlik.
  • Hassasiyet: Bir nokta (.) Ve ardından negatif olmayan bir ondalık sayı veya bir yedek alanı kullanmak mümkündür.
Bazı örnekler temelleri anlamaya yardımcı olmalıdı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;
}


. w-S Kaynak kodundaki işaret genişliği temsil eder; Aynı şekilde p-S doğruluğu için işaret.

Programla ilgili bazı ilginç gözlemler: Genişlik bir yedek alanı (1) tarafından belirtilirse başka boşluk eklenmez. Görüntülenen uzunluğundan daha büyük bir doğruluk kullanılırsa double (2 ve 3), görüntülenen değerin uzunluğu doğruluğu yansıtır. Bu gözlem bir ip için geçerli değildir (4 ve 5).








Ek olarak, genişlik ve doğruluk 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 Çiftini koy doub Varsayılan ayar farklı şekillerde kullanılır. (1). (2) Doğruluğu 3'ten 9'a kadar değiştirir. Biçim halkasının son konusu girer {} formatın formatının {:.{}}. Son olarak, (3) 'de görüntülenen çift değerlerin genişliği 10'a ayarlanmıştır.








Veri türü


Genel olarak, derleyici kullanılan değer türünü türetir. Ancak bazen veri türünü belirtmek istersiniz. Bunlar en önemli veri türleridir:

Sıyrık: s

Tamamen:

  • b: İkili format
  • B: Beğenmek bAncak temel önek 0B
  • d: ondalık biçim
  • o: Sekizinci format
  • x: Onaltılık format
  • X: Beğenmek xAncak temel önek 0X
char VE wchar_t:

  • b, B, d, o, x, X: Tam sayılar
Bool:

  • s: true VEYA false
  • b, B, d, o, x, X: Tam sayılar
Kayan Noktalar Numaraları:

  • e: Üstel Biçim
  • E: Beğenmek eAma üs ile E yazılı
  • f, F: Virgül düzeltildi; Hassasiyet 6
  • g, G: Hassas 6, ancak üs ile E yazılı
İşaretçi:

  • p: Adresinin onaltılık yazımı
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, (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ürlerini kullanabilirsiniz int Sadece farklı bir sayı sisteminde temsil eder.


// 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ırada ne var?


Şimdiye kadar temel veri ve dizeler türlerini biçimlendirdim. Tabii ki, kişiselleştirilmiş türler de oluşturulabilir. Bu bir sonraki makalemin konusu olacak.


(RME)
 
Üst