c ++ số nguyên-> std :: chuỗi chuyển đổi. Chức năng đơn giản?


76

Bài toán: Tôi có một số nguyên; số nguyên này cần được chuyển đổi thành kiểu stl :: string.

Trong quá khứ, tôi đã từng stringstreamthực hiện một chuyển đổi, và điều đó thật phức tạp. Tôi biết cách C là thực hiện một sprintf, nhưng tôi muốn thực hiện một phương thức C ++ là an toàn kiểu chữ (er).

Có cách nào tốt hơn để làm điều này?

Đây là cách tiếp cận dòng chuỗi mà tôi đã sử dụng trong quá khứ:

std::string intToString(int i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();

    return s;
}

Tất nhiên, điều này có thể được viết lại như vậy:

template<class T>
std::string t_to_string(T i)
{
    std::stringstream ss;
    std::string s;
    ss << i;
    s = ss.str();

    return s;
}

Tuy nhiên, tôi có quan điểm rằng đây là một cách thực hiện khá 'nặng đô'.

Zan lưu ý rằng lời kêu gọi khá đẹp, tuy nhiên:

std::string s = t_to_string(my_integer);

Ở bất kỳ mức độ nào, một cách đẹp hơn sẽ là ... tốt đẹp.

Có liên quan:

Thay thế cho itoa () để chuyển đổi số nguyên thành chuỗi C ++?


Trong ví dụ t_to_string của bạn, tôi không hiểu lý do tại sao cần có đặc tả mẫu. Một hàm mẫu có thể xác định loại mẫu của nó từ các loại đối số của nó.
Zan Lynx

@Zan: Chết tiệt. Đó là những gì tôi nhận được cho việc đăng mã mà tôi không biên dịch.
Paul Nathan

13
Làm thế nào về một số ví dụ từ sau: codeproject.com/KB/recipes/Tokenizer.aspx Chúng rất hiệu quả và hơi trang nhã.

@Beh: Thư viện đó nặng hơn đáng kể so với một t_to_string () đơn giản. Nó thực sự trông giống như một thư viện rất đẹp, nhưng tôi không muốn nhập toàn bộ chỉ để thực hiện một t_to_string ().
Paul Nathan

Câu trả lời:


134

Bây giờ trong c ++ 11 chúng ta có

#include <string>
string s = std::to_string(123);

Liên kết tham khảo: http://en.cppreference.com/w/cpp/string/basic_string/to_string


Rất bông. Có liên kết đến trang tiêu chuẩn mô tả chức năng không?
Paul Nathan

6
lỗi biên dịch đối với tôi - "std :: to_string: gọi mơ hồ với chức năng quá tải"
JMarsch

8
Tôi sẽ nói lại điều đó thành " Cuối cùng , chúng tôi có ...".
Sam Goldberg

28

Giống như đã đề cập trước đó, tôi khuyên bạn nên tăng lexical_cast. Nó không chỉ có một cú pháp khá đẹp:

#include <boost/lexical_cast.hpp>
std::string s = boost::lexical_cast<std::string>(i);

nó cũng cung cấp một số an toàn:

try{
  std::string s = boost::lexical_cast<std::string>(i);
}catch(boost::bad_lexical_cast &){
 ...
}

22

Không thực sự, trong tiêu chuẩn. Một số triển khai có hàm itoa () không chuẩn và bạn có thể tra cứu lexical_cast của Boost, nhưng nếu bạn tuân theo tiêu chuẩn thì có khá nhiều lựa chọn giữa stringstream và sprintf () (snprintf () nếu bạn có nó).


2
Điều tốt là điều này đã được khắc phục, hãy xem câu trả lời của Schaub
2012
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.