2013-07-17 9 views
7

Chcę zrobić operatorowi < <, który korzysta z ustawień lokalnych lub, jeśli nie jest to konieczne, manualnie, może zmienić sposób użycia "." dla separatora dziesiętnego na ",". Spróbuję uczynić, aby strumień (iostream, fstream, etc) to zrobił, a nie aby utworzyć ciąg, a następnie go wydrukować.Jak sprawić, by float używał przecinka, a nie wskazywał?

Czy to możliwe?

+0

Powinien już używać lokalizacji użytkownika? Jeśli nie, to imbue() w strumieniu – Pete

+3

Nie masz na myśli "przecinka" zamiast "dwukropek"? – Michael

+3

również, "," jest przecinkiem, a nie dwukropkiem. – Pete

Odpowiedz

13

Możesz przyswoić numnunct aspekt do swojego strumienia. Wierzę, że coś takiego powinno pracować dla Ciebie:

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.


Krótszy rozwiązanie, które wykorzystuje europejską regionalne:

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

Ale ostatecznie to zależy od ustawień regionalnych twój system zapewnia.

+2

+1 Nigdy nie wiedziałem, że to takie proste. – dyp

+5

Czy nie byłoby lepiej użyć aspektu odpowiadającego ustawieniom regionalnym systemu operacyjnego, niż zrobić taki niestandardowy? –

+0

@MarkRansom zależy - nie odpowiada bezpośrednio na pytanie o OP w tym przypadku - co jeśli on jest w Ameryce i chce * sprawić, że Amerykanie zobaczą przecinki? kto zna prawdziwy zamiar –

Powiązane problemy