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();
}