/******************************************************************************
** 文件名称:StrToData.h
** 作 者:罗振
** 完成日期:2009-9-24
******************************************************************************/
#include<iostream>
#include<string>
#include<cmath>
using namespace std;
// 有效字符
const char usechar[] = {'0','1','2','3','4','5','6','7','8','9','.'};
double calculate(const char disstr[]); /* 数据字符串转化数据 */
bool isusefuldata(const char distr[]); /* 判断数据字符串是否有效 */
int calpartofint(const char disint[]); /* 计算字符串数据整数部分 */
double calpartofdou(const char disdou[]); /* 计算字符串数据小数部分 */
int main(void)
{
char datastr[] = "2009.09";
if(isusefuldata(datastr))
{
cout<< "转化的结果为:" << calculate(datastr) <<endl;
}else{
cout<< "输入的数据不是有效数据!" <<endl;
}
return 0;
}
/*
* 函数名: isusefuldata()
* 参 数: distr:数据字符串
* 描 述: 判断目标字符串是否为数据字符串
* 返 回: true:是 false:否
*/
bool isusefuldata(const char distr[])
{
bool flag = true;
short int chlen = sizeof(usechar);
short int dislen = strlen(distr); /* 注意sizeof与strlen的区别 */
short int i = 0;
short int sumdo = 0; /* 统计数据字符串中'.'的个数 */
/* 判断数据字符串第一个字符是否为'.',是则返回false,说明该数据字符串无效. */
if(distr[0] == '.' || distr[dislen-1] == '.')
return false;
/* 判断数据字符串是否存在无效字符. */
for(short int j=0;j<dislen;j++)
{
if(distr[j] == '.')
sumdo++;
for(i=0;i<chlen;i++)
{
if(distr[j] == usechar[i])
break;
}
if(i == chlen)
{
return false;
}
}
/* 当数据字符串中出现两次以上'.'字符时,该数据字符串仍然无效 */
if(sumdo > 1)
return false;
return flag;
}
/*
* 函数名: calculate()
* 参 数: disstr:数据字符串
* 描 述: 将数据字符串转化为数据
* 返 回: 转化的结果
*/
double calculate(const char disstr[])
{
char intchar[20] = "0"; /* 保存数据字符串的整数部分,初始值为"0" */
char douchar[20] = "0"; /* 保存数据字符串的小数部分,初始值为"0" */
short int inlen = strlen(disstr);
short int sp = inlen; /* 小数点所在位置 */
short int dousp = 0;
short int i;
for(i=0;i<inlen;i++)
{
if(disstr[i] == '.')
{
sp = (i+1);
break;
}
}
/* 说明该数据字符串中整数部分和小数部分分割 */
for(i=0;i<(sp-1);i++)
intchar[i] = disstr[i];
intchar[i] = '/0';
if(sp != inlen)
{
for(i=sp;i<inlen;i++)
{
douchar[dousp++] = disstr[i];
}
douchar[dousp] = '/0';
}
return (sp == inlen ? (calpartofint(intchar)):
(double(calpartofint(intchar)) + calpartofdou(douchar)));
}
/*
* 函数名: calpartofint()
* 参 数: disint:数据字符串整型部分
* 描 述: 将数据字符串整数部分转化为整型数据
* 返 回: 转化的结果--整型数据
*/
int calpartofint(const char disint[])
{
short int i = 0;
short int inlen = strlen(disint); /* 整数部分长度 */
int sumin = 0;
for(i=0;i<inlen;i++)
sumin = sumin*10 + (disint[i] - '0');
return sumin;
}
/*
* 函数名: calpartofdou()
* 参 数: disdou:数据字符串小数部分
* 描 述: 将数据数据字符串小数部分转化为双精度型数据
* 返 回: 转化的结果--双精度型数据
*/
double calpartofdou(const char disdou[])
{
short int i = 0;
short int doulen = strlen(disdou); /* 小数部分长度 */
double sumdou = 0.0;
for(i=0;i<doulen;i++)
sumdou = sumdou + (disdou[i]-'0') * (1.0 / pow(10,(i+1)));
return sumdou;
}
声明:本文源代码所有权归博主所有,其他人不得以任何性质转载,否则将追究责任.