2013-03-05 13 views
8

Chciałbym przeczytać i zapisać pi jako 3,141592 zamiast 3.141592, ponieważ używanie przecinka jest powszechne w wielu krajach europejskich. Jak mogę to zrobić z iostream s? Innymi słowyJak ustawić separator dziesiętny jako przecinek?

cout << 3.141592; 

należy wydrukować

3,141592 

na standardowe wyjście.

+0

Masz na myśli, w kodzie? Jak 'double x = 3,14;'? –

+0

Nie w standardowym wyjściu, wprowadzaniu, odczytywaniu i zapisywaniu plików w czasie wykonywania (nie w czasie kompilacji). –

+6

jedno słowo: locale. – PlasmaHH

Odpowiedz

14

Powinieneś użyć basic_ios::imbue, aby ustawić preferowane ustawienia regionalne.

Spójrz tutaj: http://www.cplusplus.com/reference/ios/ios_base/imbue/

językowe pozwalają na skorzystanie preferowany sposób przez użytkownika, więc jeśli komputer we Włoszech używa przecinka do oddzielnych cyfr po przecinku, w USA kropka jest nadal używany. Używanie ustawień regionalnych to dobra praktyka.

Ale jeśli chcesz jawnie wymusić użycie przecinka, spójrz tutaj: http://www.cplusplus.com/reference/locale/numpunct/decimal_point/

Oto mały przykład po prostu wykonane z g ++, który wymusza char „” (przechodzącego separator jako szablon argument jest po prostu dla zabawy, nie naprawdę konieczne)

#include <iostream> 
#include <locale> 

template <class charT, charT sep> 
class punct_facet: public std::numpunct<charT> { 
protected: 
    charT do_decimal_point() const { return sep; } 
}; 

int main(int argc, char **argv) { 
    std::cout.imbue(std::locale(std::cout.getloc(), new punct_facet<char, ','>)); 
    std::cout << "My age is " << 3.1415 << " lightyears.\n"; 
} 

pamiętać, że korzystanie cout.getloc() mam unieważniając tylko jeden aspekt w aktualnie ustawionej lokalizacji, czyli w obecnych lokalnych ustawień cout, ja zmienia tylko jak interpunkcja jest wykonywana.

do_decimal_point to wirtualna funkcja std::numpunct, którą można ponownie zdefiniować w celu zapewnienia niestandardowego separatora. Ta wirtualna funkcja będzie używana przez numpunct::decimal_point podczas drukowania twojego numeru.

9

Jak powiedział @AkiRoss, musisz użyć ustawień regionalnych. W ogólnym, w dowolnym programie piszesz, jedną z pierwszych działań w main powinien być ustawić globalne ustawienia regionalne do wyboru użytkowników, wykonując coś takiego:

std::locale::global(std::locale("")); 

ta powinna być systematyczna , w każdy program, który współdziała z użytkownikiem ludzkim. Wszystkie otwarte po tym pliki będą automatycznie nasycane odpowiednim ustawieniem narodowym.

Alternatywnie, można jednoznacznie określić ustawienia regionalne, które chcesz użytku:

std::locale::global(std::locale(locale_name)); 

Problem z tym jest to, że nie ma standardowego dla locale nazwisk. Coś w rodzaju "it_IT.UTF-8" odpowiada standardowi Posix i jest używane w Internecie; System Windows tradycyjnie używał innego formatu (chociaż ostatnio system Windows może również akceptować ten format).

Która pozostawia std::cin, i std::cerr.Są to otwarte przed wpisaniem main, a więc muszą być nasycone nowym locale z . (Aby uzyskać kopię aktualnej globalnej lokalizacji, należy użyć domyślny konstruktor std::locale.)

Wreszcie, jeśli otwierania plików binarnych, należy pamiętać, że również będzie przepojone globalnej lokalizacji. Które mogą zrobić kod tłumaczenie. W takich przypadkach powinieneś je wyraźnie dodać do nazwy: z std::locale::classic() lub utworzyć nowe ustawienie regionalne przez scalenie aspektu codecvt z std::locale::classic() z innymi fasetami globalnych ustawień regionalnych . (std::locale ma specjalne funkcje i konstruktory ).

Powiązane problemy