从字符串到数字

时间:2013-10-28 20:02:19

标签: c++ string double

我试图创建一个小函数来转换整数和浮点数并将它们保存为字符串,双重类型,一切正常,但是当我在逗号后面输入许多数字时,出现问题。

#include <iostream>
#include <cmath>
using namespace std;
/////////////////////////////////////CONVERTer FUNCTION/////////
double StrToNum(string InStr)
{
int a=0;
double b,OutInt=0,DecVal=0,DoubleOut;
for(a;a<=InStr.length();a++)
{
if(InStr[a]=='.' || InStr[a]==','){break;}
if(InStr[a]=='0'){OutInt=OutInt*10+0;}        
if(InStr[a]=='1'){OutInt=OutInt*10+1;}  
if(InStr[a]=='2'){OutInt=OutInt*10+2;}  
if(InStr[a]=='3'){OutInt=OutInt*10+3;}  
if(InStr[a]=='4'){OutInt=OutInt*10+4;}  
if(InStr[a]=='5'){OutInt=OutInt*10+5;}  
if(InStr[a]=='6'){OutInt=OutInt*10+6;}  
if(InStr[a]=='7'){OutInt=OutInt*10+7;}  
if(InStr[a]=='8'){OutInt=OutInt*10+8;}  
if(InStr[a]=='9'){OutInt=OutInt*10+9;}    
}


for(a=0;a<=InStr.length();a++)
{
if(InStr[a]=='.' || InStr[a]==','){a+=1; b=1; break;}
}
for(a;a<=InStr.length();a++)
{
if(InStr[a]=='0'){ b+=1;}        
if(InStr[a]=='1'){DecVal=DecVal+1/pow(10,b); b+=1;}  
if(InStr[a]=='2'){DecVal=DecVal+2/pow(10,b); b+=1;}  
if(InStr[a]=='3'){DecVal=DecVal+3/pow(10,b); b+=1;}  
if(InStr[a]=='4'){DecVal=DecVal+4/pow(10,b); b+=1;}  
if(InStr[a]=='5'){DecVal=DecVal+5/pow(10,b); b+=1;}  
if(InStr[a]=='6'){DecVal=DecVal+6/pow(10,b); b+=1;}  
if(InStr[a]=='7'){DecVal=DecVal+7/pow(10,b); b+=1;}  
if(InStr[a]=='8'){DecVal=DecVal+8/pow(10,b); b+=1;}  
if(InStr[a]=='9'){DecVal=DecVal+9/pow(10,b); b+=1;}  
}  


DoubleOut=OutInt+DecVal;
return DoubleOut;   
}
/////////////////////////////////////CONVERTer FUNCTION/////////


int main ()
{
string InStr;
double DoubleOut;

cout<<"Please input number(will be saved as string)"<<endl;
cin>>InStr;

DoubleOut=StrToNum(InStr);
cout<<"Integer converted from string= "<<DoubleOut<<endl;


system("PAUSE");
return 0;
}

1 个答案:

答案 0 :(得分:1)

将字符串转换为浮点数并非易事。显而易见的方法是使用标准的C或C ++库,例如strtod()。如果你真的想自己转换价值观,请看看威廉克林格的How to Read Floating Point Numbers Accurately

您没有在问题中指定“很多”,但请注意double只能准确地表示15个,实际上是std::numeric_limits<double>::digits10个十进制数字。如果您有多个数字,则需要对结果进行舍入。

从实现的角度来看:一旦确定某个字符c是一个数字,您就可以使用c - '0'来计算该数字的值,也就是说,您可能希望将此公式用于{ {1}}。此外,使用isdigit()相当昂贵,可能不如计算运行因子那么准确。