推荐使用 std::to_string,因其简洁、类型安全、跨平台且性能接近 C 风格转换;它仅支持十进制转换,不支持前导零或进制控制,格式化需求应改用 std::stringstream 或 std::format。

直接用 std::to_string,C++11 起标准库就支持,无需手写或依赖第三方。
为什么推荐 std::to_string 而不是 std::stringstream 或 itoa
它专为基本类型转 std::string 设计,简洁、类型安全、无副作用。相比 std::stringstream,没有状态残留风险;相比非标准的 itoa,跨平台且不依赖 C 运行时扩展。
-
std::to_string接受int、long、long long、unsigned系列及浮点类型,自动选择合适重载 - 不抛异常(仅当输入为
NaN或无穷大时对浮点数返回固定字符串,如"nan") - 底层调用
snprintf类机制,性能接近原生 C 风格转换
std::to_string 的基本用法和常见误用
直接传入整数即可,返回值是 std::string 对象:
int x = -42; std::string s = std::to_string(x); // s == "-42"
容易出错的地方:
立即学习“C++免费学习笔记(深入)”;
- 忘记加
#include—— 编译报错:"‘to_string’ is not a member of ‘std’" - 在 C++98/03 项目中误用 —— 链接失败或编译器提示未声明,需确认编译标准(如
-std=c++11) - 试图用它格式化带前导零或进制(如十六进制)——它只做十进制有符号转换,不支持格式控制
需要格式化(如补零、指定进制)怎么办
std::to_string 不处理格式,此时应切换方案:
- 补零:先转成
std::to_string,再用std::string::insert或std::format(C++20) - 十六进制:用
std::stringstream+std::hex,或 C++17 起的std::to_chars(需自行分配缓冲区) - 高性能批量转换:
std::to_chars更快但更底层,要手动管理字符数组和错误码
例如补两位零:
int n = 5; std::string s = std::to_string(n); s = std::string(2 - s.length(), '0') + s; // "05"
进制和精度这类需求,std::to_string 从不参与——它只做一件事:把数字按默认十进制规则变成字符串。别指望它变魔术,该换工具时就换。










