2013-03-05 50 views
8

Tôi muốn đọc và viết pi3,141592 thay vì 3.141592, vì sử dụng dấu phẩy là phổ biến ở nhiều quốc gia Châu Âu. Làm thế nào tôi có thể thực hiện điều này với iostream s? Nói cách khácLàm cách nào để đặt dấu phân cách thập phân thành dấu phẩy?

cout << 3.141592; 

nên in

3,141592 

đến đầu ra tiêu chuẩn.

+0

Ý bạn là, trong mã? Giống như 'double x = 3,14;'? –

+0

Không có tệp đầu ra tiêu chuẩn, đầu vào, đọc và ghi khi chạy (không phải lúc biên dịch). –

+6

một từ: miền địa phương. – PlasmaHH

Trả lời

14

Bạn nên sử dụng basic_ios::imbue để đặt ngôn ngữ ưa thích.

Hãy xem ở đây: http://www.cplusplus.com/reference/ios/ios_base/imbue/

phá miền địa phương cho phép bạn sử dụng cách ưa thích bởi người sử dụng, vì vậy nếu một máy tính ở Italia sử dụng dấu phẩy để chữ số thập phân riêng biệt, ở Mỹ chấm vẫn được sử dụng. Sử dụng ngôn ngữ là một phương pháp hay.

Nhưng nếu bạn muốn để buộc một cách rõ ràng việc sử dụng dấu phẩy, hãy xem ở đây: http://www.cplusplus.com/reference/locale/numpunct/decimal_point/

Dưới đây là một ví dụ nhỏ tôi chỉ cần thực hiện với g ++ mà thực thi các char '' (đi qua các dấu phân cách như mẫu đối số là chỉ để cho vui, không thực sự cần thiết)

#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"; 
} 

Lưu ý rằng việc sử dụng cout.getloc() tôi trọng chỉ là một khía cạnh duy nhất trong miền địa phương hiện đang thiết lập, có nghĩa là, trong các thiết lập miền địa phương hiện tại của cout, tôi thay đổi chỉ cách chấm câu được thực hiện.

do_decimal_point là chức năng ảo của std::numpunct mà bạn có thể xác định lại để cung cấp dấu phân cách tùy chỉnh của mình. Chức năng ảo này sẽ được sử dụng bởi numpunct::decimal_point khi in số của bạn.

9

Như @AkiRoss đã nói, bạn cần sử dụng ngôn ngữ. Nói chung, trong bất kỳ chương trình bạn viết, một trong những hành động đầu tiên trong main nên để thiết lập miền địa phương toàn cầu để lựa chọn người dùng, bằng cách làm cái gì đó như:

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

này nên có hệ thống , trong mọi chương trình tương tác với người dùng của con người. Tất cả các tệp được mở sau thời gian này sẽ tự động được đính kèm với ngôn ngữ chính xác .

Ngoài ra, bạn có thể xác định một cách rõ ràng locale bạn muốn sử dụng:

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

Vấn đề với điều này là không có tiêu chuẩn cho miền địa phương tên. Một cái gì đó như "it_IT.UTF-8" tương ứng với tiêu chuẩn Posix và được sử dụng trên Internet; Windows có truyền thống là đã sử dụng định dạng khác (mặc dù Windows gần đây có vẻ như cũng chấp nhận định dạng này).

Lá nào std::cin, std::coutstd::cerr.Đây là số được mở trước khi bạn nhập main và do đó phải được nhúng bằng ngôn ngữ mới. (Để có được một bản sao của miền địa phương toàn cầu hiện nay, sử dụng constructor mặc định của std::locale.)

Cuối cùng, nếu bạn đang mở bất kỳ tập tin nhị phân, phải nhận thức được rằng họ cũng sẽ được thấm nhuần với locale toàn cầu. Mà có thể làm mã dịch. Trong những trường hợp như vậy, bạn nên truyền đạt chúng một cách rõ ràng với std::locale::classic() hoặc tạo ngôn ngữ mới bằng cách hợp nhất khía cạnh codecvt của std::locale::classic() với các khía cạnh khác của miền địa phương toàn cầu. (std::locale có các chức năng đặc biệt và các nhà thầu cho việc này.)