2013-07-17 10 views
7

Bir operatöre yapmak isteyen yerel setings kullanıp kullanmayacağına en az manuel eğer kullanımını değiştirmek mümkün < < "" ondalık ayırıcı için ",". Akımın (iostream, fstream, vb.) Bunu yapmasını ve dizeyi oluşturmamasını ve sonra basmamasını sağlamanın bir yolunu seveceğim.Float'ın virgül kullanması ve işaret etmemesi nasıl sağlanabilir?

Bu mümkün mü?

+0

Zaten kullanıcı yerel ayarını kullanmalı mıdır? Değilse, akışta imbue() biri – Pete

+3

"İki nokta üst üste" yerine "virgül" demek istemiyor musunuz? – Michael

+3

da, ',' bir virgül değil, bir virgül. – Pete

cevap

13

Akışınıza bir saydamlık yerleştirebilirsiniz. Böyle bir şey sizin için çalışması gerekir inanıyoruz:

template <typename T> 
struct comma_separator : std::numpunct<T> 
{ 
    typename std::numpunct<T>::char_type do_decimal_point() const 
    { 
     return ','; 
    } 
}; 

template <typename T> 
std::basic_ostream<T>& comma_sep(std::basic_ostream<T>& os) 
{ 
    os.imbue(std::locale(std::locale(""), new comma_separator<T>)); 
    return os; 
} 

int main() 
{ 
    std::cout << comma_sep << 3.14; // 3,14 
} 

Here is a demo.


Avrupa yerel ayarı kullanır Daha kısa çözüm:

std::cout.imbue(
    std::locale(
     std::cout.getloc(), new std::numpunct_byname<char>("de_DE.utf8"))); 

Ama nihayetinde bu yerel bağlıdır Sisteminiz sağlar.

+2

+1 Hiç bu kadar basit olduğunu bilmiyordum. – dyp

+5

İşletim sistemi yerel ayarına karşılık gelen faseti, bunun gibi özel bir yapmadan kullanmak daha iyi olmaz mıydı? –

+0

@MarkRansom bağlıdır - bu durumda OP'nin sorusunu doğrudan yanıtlamaz - ne Amerika'daysa ve bizi Amerikalıların virgül görmesini sağlamak isterse? kim doğru amacı biliyor –

İlgili konular