2009-06-17 43 views
7

Một vấn đề quốc tế phổ biến là việc chuyển đổi các giá trị kép được biểu thị bằng chuỗi. Công cụ này được tìm thấy trong rất nhiều lĩnh vực.chuyển đổi chuỗi kép và ngôn ngữ

Bắt đầu với các tập tin csv được hoặc gọi

comma separated 

hoặc

character separated 

bởi vì đôi khi chúng được lưu trữ như

1.2,3.4 
5.6,6.4 

trong khu vực tiếng Anh hoặc

1,2;3,4 
5,6;6,4 

ví dụ: khu vực ở Đức.

Từ nền tảng này, bằng cách nào đó, cần phải biết rằng hầu hết các phương thức std :: đều phụ thuộc vào miền địa phương. Vì vậy, ở Đức, họ sẽ đọc "1,2" là 1,2 và viết nó trở lại là "1,2" nhưng với một hệ điều hành tiếng Anh nó sẽ đọc "1,2" là 1 và viết nó trở lại là "1".

Do ngôn ngữ là trạng thái toàn cầu của ứng dụng nên không nên chuyển sang cài đặt khác; và ở đây chúng tôi đang gặp một số vấn đề khi tôi phải đọc một tệp CSV của Đức trên máy tiếng Anh hoặc ngược lại.

Thật khó để viết mã hoạt động giống nhau trên tất cả các máy. Luồng C++ cho phép cài đặt ngôn ngữ trên mỗi luồng.

class Punctation : public numpunct<wchar_t> 
{ 
public: 

    typedef wchar_t char_type; 
    typedef std::wstring string_type; 

    explicit Punctation(const wchar_t& decimalPoint, std::size_t r = 0) : 
    decimalPoint_(decimalPoint), numpunct<wchar_t>(r) 
    { 
    } 

    Punctation(const Punctation& rhs) : 
    decimalPoint_(rhs.decimalPoint_) 
    { 
    } 

protected: 

    virtual ~Punctation() 
    { 
    }; 

    virtual wchar_t do_decimal_point() const 
    { 
    return decimalPoint_; 
    } 

private: 

    Punctation& operator=(const Punctation& rhs); 

    const wchar_t decimalPoint_; 
}; 

... 

std::locale newloc(std::locale::classic(), new Punctation(L',')); 
stream.imbue(newloc); 

sẽ cho phép bạn khởi tạo luồng có std :: C và chỉ thay thế dấu thập phân. Điều này cho tôi khả năng bỏ qua hàng nghìn dấu phân cách, điều này cũng có thể ảnh hưởng đến nó. 1000.12 của Đức có thể trở thành "1.000,12"; hoặc bằng tiếng Anh "1.000,12" sẽ kết thúc trong sự nhầm lẫn hoàn toàn. Thậm chí thay thế "," bằng "." sẽ không giúp đỡ trong tình huống này.

Nếu tôi phải làm việc với atof và bạn bè tôi có thể sử dụng

const char decimal_point = *(localeconv()->decimal_point); 

để dắt hành vi của tôi.

Vì vậy, có rất nhiều thứ chỉ dành cho hành vi kép quốc tế. Ngay cả Visual Studio của tôi cũng gặp vấn đề bởi vì phiên bản tiếng Đức muốn viết phiên bản 8.0 thành tệp vcproj trong khi phiên bản tiếng Anh muốn thay đổi thành 8.0, điều này đã xảy ra một cách dứt khoát bởi vì trong XML nó được định nghĩa là 8.0 trong tất cả Các quốc gia trên thế giới.

Vì vậy, tôi chỉ muốn mô tả vấn đề một chút để hỏi về các khía cạnh tôi có thể đã bỏ qua. Những điều mà tôi biết:

  • pint thập phân là miền địa phương phụ thuộc
  • 000 tách phụ thuộc
  • mũ locale là miền địa phương phụ thuộc

//     German  English  Also known 
// decimal point  ,   .    
// exponent   e/E   e/E   d/D 
// thousand sep  .   , 

Những nước sử dụng mà thiết lập?Có lẽ bạn có thể thêm cho tôi một số ví dụ thú vị mà tôi không có cho đến bây giờ.

+0

http://en.wikipedia.org/wiki/Decimal_point#Examples_of_use – Pod

Trả lời

-1

Tôi nghĩ bạn đang tìm kiếm Appendix D of The C++ Programming Language. Bạn có thể quan tâm rằng có thể sử dụng nhiều miền địa phương cùng một lúc trong một chương trình.

+0

Tại sao downvote? –

2

Đừng bao giờ sử dụng atof (s). Đó là một lối tắt bẩn & bẩn cho strtod (s, 0) mà không báo cáo lỗi. (Tương tự cho atoi() và strtol().)

Nếu chức năng được quảng cáo trả về mã lỗi trong trường hợp khó khăn, bạn hãy kiểm tra mã đó, yea, mặc dù kiểm tra gấp ba lần kích thước của mã số và tạo ra đau nhức trong các ngón tay đánh máy của bạn, nếu bạn nghĩ rằng 'nó không thể xảy ra với tôi', các vị thần chắc chắn sẽ trừng phạt ngươi cho sự kiêu ngạo của bạn.

(Henry Spencer, "Mười điều răn cho C Programmer", răn # 6)

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