C ++ 20'de biçimlendirme kitaplığı: Biçim dizesi
Son makalemde “Yazılım Geliştirme: C ++ 20'de Biçimlendirme Kütüphanesi” ni sundum. Bugün biçim biçimi formatının spesifikasyonunda daha derinler.
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.
Biçim halkasının kısa bir özetiyle başlamak istiyorum.
Konu Kimliği
Değiştirme alanının içinde bir kimlik konusu ve kolon kullanabilirsiniz, ardından formatın bir göstergesi. Her iki bileşen de isteğe bağlıdır.
Kimlik konusu sayesinde bazı konular yeniden düzenlenebilir veya ele alınabilir. Kimlik konusu ile konu dizini ARGS'de belirtilebilir. Kimlik Başlangıç 0'da veya değiştirme alanlarının tamamı bir kimlik konusu kullanmalı veya hiçbiri kullanmalıdır.
// formatArgumentID.cpp
#include <format>
#include <iostream>
#include <string>
int main() {
std::cout << 'n';
std::cout << std::format("{} {}: {}!n",
"Hello", "World", 2020); // (1)
std::cout << std::format("{1} {0}: {2}!n",
"World", "Hello", 2020); // (2)
std::cout << std::format("{0} {0} {1}: {2}!n",
"Hello", "World", 2020); // (3)
std::cout << std::format("{0}: {2}!n",
"Hello", "World", 2020); // (4)
std::cout << 'n';
}
(1) Konuları belirtilen sırada görüntüle. Aksine, (2) 'deki birinci ve ikinci konu (3)' de yeniden düzenlenir, ilk konu iki kez görüntülenir ve ikinci konu (4) 'de göz ardı edilir.
Tamlık için, buradaki program baskı:
Kimlik konusunun formatın spesifikasyonu ile uygulanması, C ++ 20'de metin biçimlendirmesini çok güçlü hale getirir.
Formatın biçimi
Veri türleri, tel türleri ve krono türleri için biçimsel formatın spesifikasyonunu sunmayacağım. Veri türleri için e std::string finden sich Burada tüm ayrıntılar: Standart formatın spesifik. Sonuç olarak, Chrono türlerinin detayları burada mevcuttur: Chrono formatının spesifikasyonu.
Bunun yerine, veri türleri, tel türleri ve krono türleri için format halkasının pragmatik bir açıklamasını sunuyorum.
fill_align(opt) sign(opt) #(opt) 0(opt) width(opt) precision(opt) L(opt) type(opt)
Tüm parçalar isteğe bağlıdır (OPT). Aşağıdaki bölümlerde formatın bu biçiminin özellikleri hakkında ayrıntılara gidiyorum.
İşareti ve yönünü doldurun
Dolgu işareti isteğe bağlıdır (hariç her karakter { VEYA }ve bunu bir hizalama izler. Doldurma işaretini kullanmak için hizalamayı belirtmek gerekir.
// formatFillAlign.cpp
#include <format>
#include <iostream>
int main() {
std::cout << 'n';
int num = 2020;
std::cout << std::format("{:6}", num) << 'n';
std::cout << std::format("{:6}", 'x') << 'n';
std::cout << std::format("{:*<6}", 'x') << 'n';
std::cout << std::format("{:*>6}", 'x') << 'n';
std::cout << std::format("{:*^6}", 'x') << 'n';
std::cout << std::format("{:6d}", num) << 'n';
std::cout << std::format("{:6}", true) << 'n';
std::cout << 'n';
}
Standart yönelim, kullanılan veri türlerine bağlıdır. İOStream operatörünün aksine true VEYA false gösterilen.
İmza, # E 0
İmza, # VE 0 Yalnızca bir tür veya akış kullanılırsa geçerlidir.
İşaret aşağıdaki değerlere sahip olabilir:
// formatSign.cpp
#include <format>
#include <iostream>
int main() {
std::cout << 'n';
std::cout << std::format("{0:},{0:+},{0:-},{0: }", 0) << 'n';
std::cout << std::format("{0:},{0:+},{0:-},{0: }", -0) << 'n';
std::cout << std::format("{0:},{0:+},{0:-},{0: }", 1) << 'n';
std::cout << std::format("{0:},{0:+},{0:-},{0: }", -1) << 'n';
std::cout << 'n';
}
. # Alternatif form neden olur:
// formatAlternate.cpp
#include <format>
#include <iostream>
int main() {
std::cout << 'n';
std::cout << std::format("{:#015}", 0x78) << 'n';
std::cout << std::format("{:#015b}", 0x78) << 'n';
std::cout << std::format("{:#015x}", 0x78) << 'n';
std::cout << 'n';
std::cout << std::format("{:g}", 120.0) << 'n';
std::cout << std::format("{:#g}", 120.0) << 'n';
std::cout << 'n';
}
Sırada ne var?
Biçim biçimi ile değer verilerinin doğruluğunu, genişliğini ve türünü belirtmek mümkündür. Bunun hakkında bir sonraki makalemde yazacağım.
(RME)
C ++ 20'de biçimlendirme kitaplığı: Biçim dizesi
Son makalemde “Yazılım Geliştirme: C ++ 20'de Biçimlendirme Kütüphanesi” ni sundum. Bugün biçim biçimi formatının spesifikasyonunda daha derinler.

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.

Biçim halkasının kısa bir özetiyle başlamak istiyorum.
- Sözdizimi: std::format(FormatString, Args)
- Sıradan işaretler (hariç { VE })))
- Kaçış dizileri {{ VE }}Başından sonuna kadar { VE } değiştirilmek
- Yedek alanlar
Konu Kimliği
Değiştirme alanının içinde bir kimlik konusu ve kolon kullanabilirsiniz, ardından formatın bir göstergesi. Her iki bileşen de isteğe bağlıdır.
Kimlik konusu sayesinde bazı konular yeniden düzenlenebilir veya ele alınabilir. Kimlik konusu ile konu dizini ARGS'de belirtilebilir. Kimlik Başlangıç 0'da veya değiştirme alanlarının tamamı bir kimlik konusu kullanmalı veya hiçbiri kullanmalıdır.
// formatArgumentID.cpp
#include <format>
#include <iostream>
#include <string>
int main() {
std::cout << 'n';
std::cout << std::format("{} {}: {}!n",
"Hello", "World", 2020); // (1)
std::cout << std::format("{1} {0}: {2}!n",
"World", "Hello", 2020); // (2)
std::cout << std::format("{0} {0} {1}: {2}!n",
"Hello", "World", 2020); // (3)
std::cout << std::format("{0}: {2}!n",
"Hello", "World", 2020); // (4)
std::cout << 'n';
}
(1) Konuları belirtilen sırada görüntüle. Aksine, (2) 'deki birinci ve ikinci konu (3)' de yeniden düzenlenir, ilk konu iki kez görüntülenir ve ikinci konu (4) 'de göz ardı edilir.
Tamlık için, buradaki program baskı:

Kimlik konusunun formatın spesifikasyonu ile uygulanması, C ++ 20'de metin biçimlendirmesini çok güçlü hale getirir.
Formatın biçimi
Veri türleri, tel türleri ve krono türleri için biçimsel formatın spesifikasyonunu sunmayacağım. Veri türleri için e std::string finden sich Burada tüm ayrıntılar: Standart formatın spesifik. Sonuç olarak, Chrono türlerinin detayları burada mevcuttur: Chrono formatının spesifikasyonu.
Bunun yerine, veri türleri, tel türleri ve krono türleri için format halkasının pragmatik bir açıklamasını sunuyorum.
fill_align(opt) sign(opt) #(opt) 0(opt) width(opt) precision(opt) L(opt) type(opt)
Tüm parçalar isteğe bağlıdır (OPT). Aşağıdaki bölümlerde formatın bu biçiminin özellikleri hakkında ayrıntılara gidiyorum.
İşareti ve yönünü doldurun
Dolgu işareti isteğe bağlıdır (hariç her karakter { VEYA }ve bunu bir hizalama izler. Doldurma işaretini kullanmak için hizalamayı belirtmek gerekir.
- Dolgu işareti: Boşluklar varsayılan olarak kullanılır
- Teçhizat:
- <: Bağlantılar (sayı olmayan değerler için standart)
- >: doğru (sayılar için standart)
- ^: merkezli
// formatFillAlign.cpp
#include <format>
#include <iostream>
int main() {
std::cout << 'n';
int num = 2020;
std::cout << std::format("{:6}", num) << 'n';
std::cout << std::format("{:6}", 'x') << 'n';
std::cout << std::format("{:*<6}", 'x') << 'n';
std::cout << std::format("{:*>6}", 'x') << 'n';
std::cout << std::format("{:*^6}", 'x') << 'n';
std::cout << std::format("{:6d}", num) << 'n';
std::cout << std::format("{:6}", true) << 'n';
std::cout << 'n';
}
Standart yönelim, kullanılan veri türlerine bağlıdır. İOStream operatörünün aksine true VEYA false gösterilen.

İmza, # E 0
İmza, # VE 0 Yalnızca bir tür veya akış kullanılırsa geçerlidir.
İşaret aşağıdaki değerlere sahip olabilir:
- +: İşaret sıfır ve pozitif sayılar için kullanılır.
- -: İşaret yalnızca negatif sayılar (standart) için kullanılır.
- Mekanlar: Önde gelen alanlar, negatif olmayan sayılar için kullanılır ve negatif sayılar için daha az işaret kullanılır.
// formatSign.cpp
#include <format>
#include <iostream>
int main() {
std::cout << 'n';
std::cout << std::format("{0:},{0:+},{0:-},{0: }", 0) << 'n';
std::cout << std::format("{0:},{0:+},{0:-},{0: }", -0) << 'n';
std::cout << std::format("{0:},{0:+},{0:-},{0: }", 1) << 'n';
std::cout << std::format("{0:},{0:+},{0:-},{0: }", -1) << 'n';
std::cout << 'n';
}
. # Alternatif form neden olur:
- Tüm veri türleri durumunda, önek 0b,, 0 VEYA 0x İkili, oktoli veya onaltılık tipler için kullanılır.
- Mobil tepe numaralarına sahip veri türleri için her zaman ondalık nokta kullanılır.
- 0: Ana sıfırların doldurulması
// formatAlternate.cpp
#include <format>
#include <iostream>
int main() {
std::cout << 'n';
std::cout << std::format("{:#015}", 0x78) << 'n';
std::cout << std::format("{:#015b}", 0x78) << 'n';
std::cout << std::format("{:#015x}", 0x78) << 'n';
std::cout << 'n';
std::cout << std::format("{:g}", 120.0) << 'n';
std::cout << std::format("{:#g}", 120.0) << 'n';
std::cout << 'n';
}

Sırada ne var?
Biçim biçimi ile değer verilerinin doğruluğunu, genişliğini ve türünü belirtmek mümkündür. Bunun hakkında bir sonraki makalemde yazacağım.
(RME)