C++ std::string字符串格式化

 很遗憾的是,C++ 标准库 std::string并没有提供类似于sprintf之类的字符串格式化函数,所以就自己来实现咯。

#include <memory>
#include <cstdio>
#include <string>

template<typename ... Args>
static std::string formatString(const std::string &format, Args ... args)
{
	auto size = std::snprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
	std::unique_ptr<char[]> buf(new char[size]);
	std::snprintf(buf.get(), size, format.c_str(), args ...);
	return std::string(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
}

template<typename ... Args>
static std::wstring formatString(const std::wstring &format, Args ... args)
{
	auto size = std::swprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
	std::unique_ptr<wchar_t[]> buf(new wchar_t[size]);
	std::swprintf(buf.get(), size, format.c_str(), args ...);
	return std::wstring(buf.get(), buf.get() + size - 1); // We don't want the '\0' inside
}


template<typename ... Args>
static void formatStringEx(std::string &dst, const std::string &format, Args ... args)
{
	auto size = std::snprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
	std::unique_ptr<char[]> buf(new char[size]);
	std::snprintf(buf.get(), size, format.c_str(), args ...);
	dst = { buf.get(),  buf.get() + size - 1 };
}

template<typename ... Args>
static void formatStringEx(std::wstring &dst, const std::wstring &format, Args ... args)
{
	auto size = std::swprintf(nullptr, 0, format.c_str(), args ...) + 1; // Extra space for '\0'
	std::unique_ptr<wchar_t[]> buf(new wchar_t[size]);
	std::swprintf(buf.get(), size, format.c_str(), args ...);
	dst = { buf.get(),  buf.get() + size - 1 };
}

 示例程序:

int main(int argc, char *argv[])
{
	std::string str;
	std::wstring wstr;

	std::string str_1 = formatString("%s, %d, %f, %.2lf", "today", 2, 2.1, 0.1);
	formatStringEx(str, "%s, %d, %f, %.2lf", "today", 2, 2.1, 0.1);

	std::wstring wstr_1 = formatString(L"%s, %d, %f, %.2lf", L"today", 2, 2.1, 0.1);
	formatStringEx(wstr, L"%s, %d, %f, %.2lf", L"today", 2, 2.1, 0.1);

	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值