2013-07-17 30 views
7

Tôi muốn thực hiện một toán tử < < sử dụng các thiết lập cục bộ hoặc nếu không ít nhất là thủ công có thể thay đổi việc sử dụng "." cho dấu phân cách thập phân thành ",". Tôi sẽ giống như một cách để làm cho rằng dòng (iostream, fstream, vv) để làm điều này và không phải để tạo ra các chuỗi và sau đó in nó.Làm thế nào để làm cho một phao sử dụng phao và không phải điểm?

Điều này có khả thi không?

+0

Nó phải đã sử dụng ngôn ngữ người dùng? Nếu không, imbue() một trên dòng – Pete

+3

Bạn không có nghĩa là "dấu phẩy" thay vì "dấu hai chấm"? – Michael

+3

cũng, ',' là dấu phẩy, không phải dấu hai chấm. – Pete

Trả lời

13

Bạn có thể truyền đạt một khía cạnh numpunct lên luồng của mình. Tôi tin rằng một cái gì đó như thế này nên làm việc cho bạn:

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.


Một giải pháp ngắn hơn, trong đó sử dụng một miền địa phương châu Âu:

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

Nhưng cuối cùng nó phụ thuộc vào miền địa phương đó hệ thống của bạn cung cấp.

+2

+1 Không bao giờ biết nó quá đơn giản. – dyp

+5

Sẽ không tốt hơn nếu sử dụng các khía cạnh tương ứng với ngôn ngữ OS hơn là làm một cái tùy chỉnh như thế? –

+0

@MarkRansom phụ thuộc - không trả lời trực tiếp câu hỏi của OP trong trường hợp đó - điều gì xảy ra nếu anh ta ở Mỹ và muốn * làm cho chúng ta người Mỹ thấy dấu phẩy? ai biết được ý định thực sự –

Các vấn đề liên quan