C++20'deki biçimlendirme kitaplığı: biçim dizesi

Adanali

Member


  1. C++20'deki biçimlendirme kitaplığı: biçim dizesi

Son yazımda “Yazılım Geliştirme: C++20 Formatlama Kütüphanesi”ni tanıtmıştım. Bugün format dize formatının özelliklerini inceleyeceğim.

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.













Biçim dizesinin kısa bir özetiyle başlayayım.

  • Sözdizimi: std::format(FormatString, Args)
Biçim dizesi BiçimDizesi oluşur

  • Sıradan karakterler (hariç { VE })
  • Kaçış dizileri {{ VE }}İle ilgili { VE } Değiştirilmek
  • Değiştirme alanları
Bir değiştirme alanı şu formata sahiptir: { }.

Konu Kimliği


Değiştirme alanında bir bağımsız değişken kimliği ve iki nokta üst üste kullanıp ardından bir biçim belirtimi kullanabilirsiniz. Her iki bileşen de isteğe bağlıdır.

Konu kimliği sayesinde bazı konular yeniden düzenlenebilir veya ele alınabilir. Konu kimliği, Args'deki konuların dizinini belirtmek için kullanılabilir. Kimlikler 0 ile başlar. Konu kimliği belirtilmezse alanlar, konuların belirtildiği sırayla doldurulur. Tüm değiştirme alanlarında konu kimliği kullanılmalı veya hiç kullanılmamalıdır.


// formatArgumentID.cpp

#include <format>&#13;
#include <iostream>&#13;
#include <string>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << std::format("{} {}: {}!n", &#13;
"Hello", "World", 2020); // (1)&#13;
&#13;
std::cout << std::format("{1} {0}: {2}!n",&#13;
"World", "Hello", 2020); // (2)&#13;
&#13;
std::cout << std::format("{0} {0} {1}: {2}!n",&#13;
"Hello", "World", 2020); // (3)&#13;
&#13;
std::cout << std::format("{0}: {2}!n", &#13;
"Hello", "World", 2020); // (4)&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


(1) konuları belirtilen sırayla görüntüler. Buna karşılık, (2)'de birinci ve ikinci argümanlar yeniden düzenlenir, (3)'te ilk argüman iki kez gösterilir ve (4)'te ikinci argüman göz ardı edilir.

Bütünlüğü sağlamak için programın çıktısı aşağıda verilmiştir:








Kimlik argümanını format spesifikasyonuyla uygulamak, C++20'de metin formatlamayı çok güçlü kılar.

Biçim spesifikasyonu


Veri türleri, dize türleri ve kronograf türleri için resmi format spesifikasyonunu tanıtmayacağım. Veri türleri için ve std::string finden sich Tüm ayrıntılar burada: standart format özellikleri. Buna göre krono türlerine ilişkin ayrıntılar burada bulunabilir: krono formatı spesifikasyonu.

Bunun yerine veri türleri, dize türleri ve kronograf türleri için format dizesinin pragmatik bir tanımını sunacağım.


fill_align(opt) sign(opt) #(opt) 0(opt) width(opt) precision(opt) L(opt) type(opt) &#13;



Tüm parçalar opsiyoneldir (isteğe bağlı). Aşağıdaki bölümlerde bu format spesifikasyonunun özelliklerini daha ayrıntılı olarak tartışacağım.

Karakterleri doldurma ve hizalama


Doldurma karakteri isteğe bağlıdır (hariç herhangi bir karakter) { VEYA }) ve ardından bir hizalama ifadesi gelir. Dolgu karakterini kullanmak için hizalamayı belirtmeniz gerekir.

  • Doldurma karakteri: Boşluk karakteri varsayılan olarak kullanılır
  • Oryantasyon:
    • <: sol (sayı olmayan değerler için varsayılan)
    • >: sağ (sayılar için varsayılan)
    • ^: merkezli

// formatFillAlign.cpp&#13;
&#13;
#include <format>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
int num = 2020;&#13;
&#13;
std::cout << std::format("{:6}", num) << 'n'; &#13;
std::cout << std::format("{:6}", 'x') << 'n'; &#13;
std::cout << std::format("{:*<6}", 'x') << 'n';&#13;
std::cout << std::format("{:*>6}", 'x') << 'n';&#13;
std::cout << std::format("{:*^6}", 'x') << 'n';&#13;
std::cout << std::format("{:6d}", num) << 'n';&#13;
std::cout << std::format("{:6}", true) << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}


Varsayılan hizalama, kullanılan veri türlerine bağlıdır. iostream operatöründen farklı olarak Boolean değerleri şu şekilde önceden tanımlanır: true VEYA false gösterildi.








İmza, # ve 0


İmza, # VE 0 yalnızca bir tamsayı veya kayan nokta türü kullanıldığında geçerlidirler.

İşaret aşağıdaki değerleri alabilir:

  • +: Sıfır ve pozitif sayılar için işaret kullanılır.
  • -: İşaret yalnızca negatif sayılar için kullanılır (varsayılan).
  • Boşluk: Negatif olmayan sayılar için baştaki boşluk, negatif sayılar için eksi işareti kullanılır.

// formatSign.cpp&#13;
&#13;
#include <format>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << std::format("{0:},{0:+},{0:-},{0: }", 0) << 'n';&#13;
std::cout << std::format("{0:},{0:+},{0:-},{0: }", -0) << 'n';&#13;
std::cout << std::format("{0:},{0:+},{0:-},{0: }", 1) << 'n';&#13;
std::cout << std::format("{0:},{0:+},{0:-},{0: }", -1) << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}&#13;



THE # alternatif forma neden olur:

  • Tamsayı veri türleri için önek 0b, 0 VEYA 0x ikili, sekizli veya onaltılı temsil edilen türler için kullanılır.
  • Kayan nokta veri türleri her zaman ondalık nokta kullanır.
  • 0: Baştaki sıfırlarla doldurma

// formatAlternate.cpp&#13;
&#13;
#include <format>&#13;
#include <iostream>&#13;
&#13;
int main() {&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << std::format("{:#015}", 0x78) << 'n';&#13;
std::cout << std::format("{:#015b}", 0x78) << 'n';&#13;
std::cout << std::format("{:#015x}", 0x78) << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
std::cout << std::format("{:g}", 120.0) << 'n';&#13;
std::cout << std::format("{:#g}", 120.0) << 'n';&#13;
&#13;
std::cout << 'n';&#13;
&#13;
}&#13;









Sıradaki ne?


Biçim belirtici, değerin kesinliğini, genişliğini ve veri türünü belirtmek için kullanılabilir. Bu konuyu bir sonraki yazımda yazacağım.


(kendim)



Haberin Sonu
 
Üst