一个字符串转换类

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

注:如果你没有使用boost库,把#define USE_BOOST_LIBS注释掉

ContractedBlock.gifExpandedBlockStart.gif字符串转换类
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->
/**
*@briefClassthatmakestringdataautomaicallyconvertedtonumericdata
*
*/
classCStringAutoCast
{
public:
/**
*E_format:enumerationoftypeofinputdata
*/
typedef
enum
{
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,dot.gif)
*
*@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();
unsigned
charc=ReadDataFromFile();
longd=ReadDataFromFile(CStringAutoCast::kOct);//specifiesthatthestringreadisinOctalformat
unsignedlonge=ReadDataFromFile(CStringAutoCast::kHex);//specifiesthatthestringreadisinHexadecimalformat
std::stringf=ReadDataFromFile();

return0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值