2010-05-15 30 views
50

printf%02d eşdeğer biçimli bir std::stringstream numaralı tamsayıya çıktı vermek istiyorum.std :: stringstream ile% 02d eşdeğeri?

std::stringstream stream; 
stream.setfill('0'); 
stream.setw(2); 
stream << value; 

, stringstream için böyle bir şey (yalancı kod) formatında bayrakları çeşit akarsu mümkün mü: daha bunu başarmak için daha kolay bir yolu var mı

stream << flags("%02d") << value; 
+5

Bu "stream.fill ('0')' ve 'stream.width (2)' olmalıdır? Manipülatörlerin adını neredeyse kendi sorunuzun cevabını bildiğiniz gibi kullanıyorsunuz? –

cevap

63

Standart manipülatörleri <iomanip>'dan kullanabilirsiniz, ancak fill ve width'u bir kerede temizleyen bir tane yok:

stream << std::setfill('0') << std::setw(2) << value; 

akışı içine sokulan her iki işlevlerini gerçekleştirdiği kendi nesneyi yazmaya zor olmaz:

stream << myfillandw('0', 2) << value; 

Ör

struct myfillandw 
{ 
    myfillandw(char f, int w) 
     : fill(f), width(w) {} 

    char fill; 
    int width; 
}; 

std::ostream& operator<<(std::ostream& o, const myfillandw& a) 
{ 
    o.fill(a.fill); 
    o.width(a.width); 
    return o; 
} 
9

kullanabilirsiniz

stream<<setfill('0')<<setw(2)<<value; 
9

Standart C++'da bunu daha iyi yapamazsınız. stringstream biçim bayrakları çeşit akarsu

stream << boost::format("%|02|")%value; 
+1

Ve eğer başka bir şey için 'stream' kullanmıyorsanız, buna ihtiyacınız yoktur, çünkü 'boost :: format' zaten bir dize üretir. – UncleBens

+1

"str (...)' ye iletmeniz gerektiğini duydum. –

+0

Jahonnes std :: string kullanabilirsiniz myStr = (boost :: format ("% | 02 |")% value) .str(); –

0

mümkün mü: Alternatif olarak, Boost.Format kullanabilir?

Maalesef standart kütüphane bir dize olarak biçim belirteçleri geçen desteklemez, ancak fmt library ile yapabilirsiniz:

std::string result = fmt::format("{:02}", value); // Python syntax 

veya

std::string result = fmt::sprintf("%02d", value); // printf syntax 

Hatta yok std::stringstream yapması gerekiyor. format işlevi doğrudan bir dize döndürecektir.

Sorumluluk Reddi: Ben fmt library'un yazarıyım.

İlgili konular