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.
// 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.
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:
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("{
}", num)
<< 'n';
std::cout << "hexadecimal: " << std::format("{:x}", num)
<< 'n';
}
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
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.
// 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.

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
- b, B, d, o, x, X: tamsayılar gibi
- s: true VEYA false
- b, B, d, o, x, X: tamsayılar gibi
- 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ı
- p: adresinin onaltılık gösterimi
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("{
<< 'n';
std::cout << "hexadecimal: " << std::format("{:x}", num)
<< 'n';
}

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