在C++中将字符串类转换为整型,浮点型并不像java,C#那样简单,这是件烦心的工作,而且不同的函数接口让代码维护起来也麻烦,所以写个自动进行字符串转换成所需要的类型的程序很有意义,下面这个类只有加入你想要的类型,并为之提供操作符重载就可以了。
注:如果你没有使用boost库,把#define USE_BOOST_LIBS注释掉


<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
/**
*@briefClassthatmakestringdataautomaicallyconvertedtonumericdata
*
*/
classCStringAutoCast
{
public:
/**
*E_format:enumerationoftypeofinputdata
*/
typedefenum
{
kDec=0,
kBin=1,
kHex=2,
kOct=3
}E_format;
public:
CStringAutoCast(conststd::string&input,E_formatformat=kDec);
virtual~CStringAutoCast();
operatorbool()const;
operatorstd::string()const;
operatorunsignedint()const;
operatorint()const;
operatorunsignedshort()const;
operatorshort()const;
operatorunsignedlong()const;
operatorlong()const;
operatorunsignedchar()const;
operatorchar()const;
operatorfloat()const;
protected:
/**
*m_data:datatoconvert
*/
std::stringm_data;
/**
*m_format:formatofdatatoconvertfrom
*/
E_formatm_format;
};
#include"stdafx.h"
#include"StringAutoCast.h"
//commentthislineifyoucannotcompilewithboostlibrairies
#defineUSE_BOOST_LIBS
#ifdefUSE_BOOST_LIBS
#include"boost/lexical_cast.hpp"
#endif
//////////////////////////////////////////////////////////////////////
//Globalfunctions
//////////////////////////////////////////////////////////////////////
/**
*@briefconvertastringfromaE_format(hex,dec,octorbin)toaninteger-likereturntype
*
*@paramm_datastringdatatoconvert
*@paramm_formatformatofdata
*
*@returndataconvertedtotemplatetype
*/
template<classT>
T_internal_integer_convert(conststd::string&m_data,constCStringAutoCast::E_formatm_format)
{
Tret;
switch(m_format)
{
caseCStringAutoCast::kDec:
sscanf(m_data.c_str(),"%d",&ret);
break;
caseCStringAutoCast::kBin:
sscanf(m_data.c_str(),"%b",&ret);
break;
caseCStringAutoCast::kHex:
sscanf(m_data.c_str(),"%x",&ret);
break;
caseCStringAutoCast::kOct:
sscanf(m_data.c_str(),"%o",&ret);
break;
}
returnret;
}
//////////////////////////////////////////////////////////////////////
//Construction/Destruction
//////////////////////////////////////////////////////////////////////
/**
*@briefConstructor
*
*@paraminputdatatoconvert
*@paramformatformatofdata
*
*/
CStringAutoCast::CStringAutoCast(conststd::string&input,E_formatformat/*=kDec*/)
:m_format(format),m_data(input)
{
}
/**
*@briefDestructor
*
*
*/
CStringAutoCast::~CStringAutoCast()
{
}
/**
*@briefoperatorforbool
*
*
*@returnCStringAutoCastdataasbool
*/
CStringAutoCast::operatorbool()const
{//这里就不去考虑大小写的问题了
return(m_data=="true"||m_data=="1");
}
/**
*@briefoperatorforstd::string
*
*
*@returnCStringAutoCastdataasstd::string(noconversioninthiscase)
*/
CStringAutoCast::operatorstd::string()const
{
returnm_data;
}
/**
*@briefoperatorforunsignedint
*
*
*@returnCStringAutoCastdataasunsignedint
*/
CStringAutoCast::operatorunsignedint()const
{
return_internal_integer_convert<unsignedint>(m_data,m_format);
}
/**
*@briefoperatorforint
*
*
*@returnCStringAutoCastdataasint
*/
CStringAutoCast::operatorint()const
{
return_internal_integer_convert<int>(m_data,m_format);
}
/**
*@briefoperatorforunsignedshort
*
*
*@returnCStringAutoCastdataasunsignedshort
*/
CStringAutoCast::operatorunsignedshort()const
{
return_internal_integer_convert<unsignedshort>(m_data,m_format);
}
/**
*@briefoperatorforshort
*
*
*@returnCStringAutoCastdataasshort
*/
CStringAutoCast::operatorshort()const
{
return_internal_integer_convert<short>(m_data,m_format);
}
/**
*@briefoperatorforunsignedlong
*
*
*@returnCStringAutoCastdataasunsignedlong
*/
CStringAutoCast::operatorunsignedlong()const
{
return_internal_integer_convert<unsignedlong>(m_data,m_format);
}
/**
*@briefoperatorforlong
*
*
*@returnCStringAutoCastdataaslong
*/
CStringAutoCast::operatorlong()const
{
return_internal_integer_convert<long>(m_data,m_format);
}
/**
*@briefoperatorforunsignedchar
*
*
*@returnCStringAutoCastdataasunsignedchar
*/
CStringAutoCast::operatorunsignedchar()const
{
return_internal_integer_convert<unsignedchar>(m_data,m_format);
}
/**
*@briefoperatorforchar
*
*
*@returnCStringAutoCastdataaschar
*/
CStringAutoCast::operatorchar()const
{
return_internal_integer_convert<char>(m_data,m_format);
}
/**
*@briefoperatorforfloat
*
*
*@returnCStringAutoCastdataasfloat
*/
CStringAutoCast::operatorfloat()const
{
#ifdefUSE_BOOST_LIBS
returnboost::lexical_cast<float>(m_data);
#else
floatret;
sscanf(m_data.c_str(),"%f",&ret);
returnret;
#endif
}
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
//StringAutomaticCast.cpp:Definestheentrypointfortheconsoleapplication.
//
#include <stdio.h>
#include <string>
#include"StringAutoCast.h"
/**
*@briefReaddatafromafileandautomaticallyconvertittoreturndatatype
*
*@paramformatspecifytheformatofreaddata(onlyforinter-likedata(int,short,char,long,
)
*
*@returnCStringAutoCast
*/
CStringAutoCastReadDataFromFile(CStringAutoCast::E_formatformat=CStringAutoCast::kDec)
{
/*
hereputsomecodethatreadafile(txt,xmlorwhateveryouwant)and
extractdataasstd::stringcsReadFromFile
*/
conststd::stringcsReadFromFile="230";
returnCStringAutoCast(csReadFromFile,format);
}
intmain(intargc,char*argv[])
{
inta=ReadDataFromFile();
floatb=ReadDataFromFile();
unsignedcharc=ReadDataFromFile();
longd=ReadDataFromFile(CStringAutoCast::kOct);//specifiesthatthestringreadisinOctalformat
unsignedlonge=ReadDataFromFile(CStringAutoCast::kHex);//specifiesthatthestringreadisinHexadecimalformat
std::stringf=ReadDataFromFile();
return0;
}
//StringAutomaticCast.cpp:Definestheentrypointfortheconsoleapplication.
//
#include <stdio.h>
#include <string>
#include"StringAutoCast.h"
/**
*@briefReaddatafromafileandautomaticallyconvertittoreturndatatype
*
*@paramformatspecifytheformatofreaddata(onlyforinter-likedata(int,short,char,long,

*
*@returnCStringAutoCast
*/
CStringAutoCastReadDataFromFile(CStringAutoCast::E_formatformat=CStringAutoCast::kDec)
{
/*
hereputsomecodethatreadafile(txt,xmlorwhateveryouwant)and
extractdataasstd::stringcsReadFromFile
*/
conststd::stringcsReadFromFile="230";
returnCStringAutoCast(csReadFromFile,format);
}
intmain(intargc,char*argv[])
{
inta=ReadDataFromFile();
floatb=ReadDataFromFile();
unsignedcharc=ReadDataFromFile();
longd=ReadDataFromFile(CStringAutoCast::kOct);//specifiesthatthestringreadisinOctalformat
unsignedlonge=ReadDataFromFile(CStringAutoCast::kHex);//specifiesthatthestringreadisinHexadecimalformat
std::stringf=ReadDataFromFile();
return0;
}