数值字符串转化为真实数值

来源:互联网 发布:seo实战密码 pdf 编辑:程序博客网 时间:2024/05/02 01:27

/******************************************************************************

** 文件名称: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;
}

 

声明:本文源代码所有权归博主所有,其他人不得以任何性质转载,否则将追究责任.

原创粉丝点击