记录下开发过程中c++中几个方便的转换、小函数,便于查阅

 1.double保留小数精度

floor(doubleData* pow(10,3) + 0.5)/ pow(10, 3);

2. c++中字符串分割

#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/classification.hpp>


string str = “123/456,789”;
vector<string> vStr;
/*
boost::is_any_of:设定分割的字符串
boost::token_compress_on:将连续多个分隔符当一个
*/
boost::split(vStr, strKjName, boost::is_any_of("/,"), boost::token_compress_on);

3.c++中字符串替换


#include "boost/algorithm/string/replace.hpp"

std::string strTmp = "F:\\\\standalone_project\\database\\barcfg.db";
//将字符串中‘\\’替换为‘/’
boost::replace_all(strTmp, "\\", "/");

 4.判断string是否包含特殊字符

#include<regex>

    CString str1 = "测2试132SDf1fFSD水电+费sd3fsdf_";
/*
*由于使用场景是mfc,这里使用CString字符串(string\wstring都行),通过其函数转化为char*或wchar*类型。
*除了wregex还有regex函数,跟环境有关吧。经测试,在我自己的项目环境中使用wregex可以,但regex不行,使用时可以相应测试调整。
*[\u4e00-\u9fa5_a-zA-Z0-9]+的解释:匹配字符串是否由\u4e00-\u9fa5(中文)、_(下划线)、a-z(小写字母)、A-Z(大写字母)、0-9(数字)组成。
*/
    bool ret = regex_match(str1.AllocSysString(), wregex(L"[\u4e00-\u9fa5_a-zA-Z0-9]+"));
/*
str1 =测2试132SDf1fFSD水电+费sd3fsdf_; -> ret=false
str1 =测2试132SDf1fFSD费sd3fsdf_; -> ret=true
*/

 5.原始字符串(c++11新特性)

今天项目里代码要使用文件路径,然后就考虑文件路径的是否合规问题了(主要是“\”转义的问题),查找资料过程中碰见该知识点,尽管最后没解决需求,但还是记录一下

/*
原始字符串语法规则:R"()"
描述:在()里写的字符串,可以不用考虑转义问题,所写即所得
*/
string str=R"(C:\c\zip)";//cout输出 “C:\c\zip”
string str="C:\a\tmp";//cout输出 “C:czip”

//错误的使用方式。搜了资料,目前暂时认为该R语法规则,不能作用于变量,即下面的方式会报错:
string strTmp="C:\c\zip";
string str=R"(strTmp)";//cout输出 “strTmp”

6.字符串的格式化

代码里需要拼接sql字符串 拼接,但使用string的“+”、“append()”这两个方法拼接的字符串在代码里看着不直观,于是使用了boost::format的拼接方式,这里粗浅记录下用法。

#include "boost/format.hpp"

string str = "str1";
int int1= 100;
float float1 = 1.333;

//字符类型(%s、%f等)拼接方式
//输出:这是测试str1,100,1.333000
cout<<boost::format("这是测试%s,%d,%f") % str% int1% float1<<"\n"<<endl;

//字符位置(%1%、%2%等)拼接方式
//输出:这是测试str1,1.333,100
cout << boost::format("这是测试%1%,%3%,%2%") % str% int1% float1<<endl;

//可以使用str()函数转化为string字符串
string sqlSe = str(format("SELECT name FROM sqlite_master WHERE type='table' AND name='%s'")%tableName);

 7.获取当前程序运行路径、wstring-string间相互转化

做了一个exe小插件,需要获取到exe的运行路径作为默认文件输出路径。其中由于系统函数调用的生成结果为wstring,用到了其与string的转化函数。

#include<string>
#include< windows.h >

//wstring->string
std::string Wchar2Char(const std::wstring& str)
{
	std::string result;
	int len = WideCharToMultiByte(CP_ACP, 0, str.c_str(), -1, NULL, 0, NULL, NULL);
	if (len <= 0)
	{
		return result;
	}
	char* buffer = new char[len];
	memset(buffer, 0, len);

	WideCharToMultiByte(CP_ACP, 0, str.c_str(), -1, buffer, len, NULL, NULL);
	result = buffer;

	delete[] buffer;
	return result;
}

//获取exe所在的路径
std::string getExePath()
{
    //获取运行exe的路径,如C:\\test\\test.exe
	wchar_t szPath[MAX_PATH];
	GetModuleFileName(NULL, szPath, MAX_PATH);
	std::wstring pathNameW(szPath);
	std::string pathName= Wchar2Char(szPath);
    
    //从字符串结尾处查找并返回第一个"\\"的下标
	int lPos=pathName.find_last_of("\\");
    //截取字符串,返回exe所在文件夹,如:C:\\test
	return pathName.substr(0, lPos);
}

// string->wstring
std::wstring Char2Wchar(const std::string& str)
{
		std::wstring result;

		// 获得缓冲区的宽字符个数
		int len = MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, NULL, 0);
		if (len <= 0)
		{
			return result;
		}
		wchar_t* buffer = new wchar_t[len];
		memset(buffer, 0, 2 * len);

		MultiByteToWideChar(CP_ACP, 0, str.c_str(), -1, buffer, len);
		result = buffer;

		delete[] buffer;
		return result;
}

8.数字保留一定精度转化为string或wstring

//输入double,按照指定精度precision转化为wstring
std::wstring DoubleToString(const double& value, int precision = 0)
{
	std::wstringstream stream{};
	stream << std::fixed << std::setprecision(precision) << value;
	return stream.str();
}
//输入double,按照指定精度precision转化为string
std::string DoubleToString(const double& value, int precision = 0)
{
	std::stringstream stream{};
	stream << std::fixed << std::setprecision(precision) << value;
	return stream.str();
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

巨菜的阿豪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值