C++字符串数字相互转换

来源:互联网 发布:石家庄百度盘古网络 编辑:程序博客网 时间:2024/04/29 22:43
C++字符串,数字相互转换

一.将CString转为CTime的几种方法

CString   timestr   =   "2000年04月05日";  
  int   a,b,c   ;  
  sscanf(timestr.GetBuffer(timestr.GetLength()),"%d年%d月%d日",&a,&b,&c);  
  CTime   time(a,b,c,0,0,0);    

--------or - ---------------------

 CString   s("2001-8-29   19:06:23");  
  int   nYear,   nMonth,   nDate,   nHour,   nMin,   nSec;  
  sscanf(s,   "%d-%d-%d   %d:%d:%d",   &nYear,   &nMonth,   &nDate,   &nHour,   &nMin,   &nSec);  
  CTime   t(nYear,   nMonth,   nDate,   nHour,   nMin,   nSec);

---- or ------------------------
CString   timestr   =   "2000年04月05日";  
  int   year,month,day;  
  BYTE   tt[5];  
  //get   year  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[0];  
  tt[1]   =   timestr[1];  
  tt[2]   =   timestr[2];  
  tt[3]   =   timestr[3];  
  year=   atoi((char   *)tt);  
   
  //get   month  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[6];  
  tt[1]   =   timestr[7];  
  month   =   atoi((char   *)tt);  
  //get   day  
  memset(tt,   0,   sizeof(tt));  
  tt[0]   =   timestr[10];  
  tt[1]   =   timestr[11];  
   
  CTime   time(year,month,day,0,0,0);

从上面来看,很明显使用sscanf()函数的优势.


二.将CTIme转换为CString的方法:

CTime  tmSCan = CTime::GetCurrentTime();

CString szTime = tmScan.Format("'%Y-%m-%d %H:%M:%S'");

这样得到的日期时间字符串就是以"2006-11-27 23:30:59"的格式.这是不是很方便呢?

 //取得CTime中的日期
 CString cstrDate = tmScan.Format("%Y-%m-%d");

 //取得CTime中的时间
 CString cstrTime = tmScan.Format("%H:%M-%S");

          sprintf还有个不错的表妹:strftime,专门用于格式化时间字符串的,用法跟她表哥很像,也是一大堆格式控制符,只是毕竟小姑娘家心细,她还要调用者指定缓冲区的最大长度,可能是为了在出现问题时可以推卸责任吧。这里举个例子:

 更多更好的sprintf()函数说明参考:《spirntf,你知道多少?》


http://blog.csdn.net/steedhorse/archive/2005/03/25/330206.aspx


time_t t = time(0);

      //产生"YYYY-MM-DD hh:mm:ss"格式的字符串。

char s[32];

strftime(s, sizeof(s), "%Y-%m-%d %H:%M:%S", localtime(&t));

sprintf在MFC中也能找到他的知音:CString::Format,strftime在MFC中自然也有她的同道:CTime::Format,这一对由于从面向对象哪里得到了赞助,用以写出的代码更觉优雅。

三,字符串转换为数值类型

将字符串"20.0E6"转换为数字

1,sscanf("20.0e5","%d",&x);

2,atof("20.0E6");

许多人用atoi(), atof() 和这个“家族”中的其它函数. 它们方便应用,但是有一个重要的缺点:
在转换失败和转换字符串"0"时都返回0, 这样使得一致性错误检查变得几乎不可能。 为了完整性我们给出了小段代码:

代码:
--------------------------------------------------------------------------------
   const char* str_int = "777";
   const char* str_float = "333.3";
   int i = atoi(str_int);
   float f = atof(str_float);
--------------------------------------------------------------------------------
一个更好的办法:

更有一点复杂, 更遗一致的办法是利用sscanf()

代码:
--------------------------------------------------------------------------------
   const char* str_int = "777";
   const char* str_float = "333.3";
   int i;
   float f;
   if(EOF == sscanf(str_int, "%d", &i)){
      //错误
   }
   if(EOF == sscanf(str_float, "%f", &f)){
      //错误
   }
--------------------------------------------------------------------------------

Since sscanf() takes a const char* parameter, you can directly use a CString with it:
因为sscanf()用const char* 作为参数, 所以你可以直接用CString作参数:

代码:
--------------------------------------------------------------------------------
   CString str_int("777");
   if(EOF == sscanf(str_int, "%d", &i)){
      //error
   }
--------------------------------------------------------------------------------

小心格式描述符(如本例中的"%d")。 sscanf()没有办法检查格式描述符与传递变量的类型匹配与否。如果不匹配你将得到不可预期的结果。 同样注意sscanf()可以一次从字符串中提取一个或多个数值。 详细信息请查阅MSDN。

C++ 方法

如下的例子展示了利用标准C++类的来完成这个任务的模板函数

代码:
--------------------------------------------------------------------------------
#include <string>
#include <sstream>
#include <iostream>


template <class T>
bool from_string(T &t,
                 const std::string &s,
                 std::ios_base & (*f)(std::ios_base&))
{
   std::istringstream iss(s);
   return !(iss>>f>>t).fail();
}

int main()
{
   int i;
   float f;
   // from_string()的第三个参数应为如下中的一个
   // one of std::hex, std::dec 或 std::oct
   if(from_string<int>(i, std::string("ff"), std::hex)){
      std::cout<<i<<std::endl;
   }
   else{
      std::cout<<"from_string failed"<<std::endl;
   }
   if(from_string<float>(f,
                               std::string("123.456"),
                               std::dec))
   {
      std::cout<<f<<std::endl;
   }
   else{
      std::cout<<"from_string failed"<<std::endl;
   }
   return 0;
}


/* 输出:
255
123.456
*/


四, int char * float and CString Covernt

1。 int <->CString

1) int ->CString

int n = 1;


CString str;

str.Format("%d",n);

2) CString->int

CString str = "1";

int n = atoi(str.GetBuffer(0));

2. char* 与CString

1)char*->CString

char sz[128];

CString str;

str.Format("%s",sz);

2) CString -> char*

CString str;

//int nLength = str.GetLength();

char* sz = str.GetBuffer(0);

3. float<->CString

1)float->CString

float f = 0.0;

CString str;

str.Format("%f",f);

2) CString->float

CString str = "0.0";

float f = atof(str.GetBuffer(0));
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 图虫签约师通过了认证标识怎么办 签证做假工作证明资料被拒怎么办 在广州办个建设厅电工证怎么办 水利考的五大员证到有效期怎么办 额头注射玻尿酸吸收后不平怎么办 施工员证书挂靠拿不回来怎么办 森林公安未转政法编制的人员怎么办 北京的限行新政策外地车怎么办 报考二级建造师工作年限不够怎么办 郑州航院图书馆密码忘了怎么办 无锡妇幼预约挂号过号了怎么办 云南建筑八大员考试没通过怎么办 订车ax7一个月提不到车怎么办 提车时间到了却没车怎么办 一汽大众速腾气囊灯亮该怎么办呢? 幼儿园上课时候电脑上的课件怎么办 黑米紫薯红豆粥不好煮怎么办 母狗生了小狗后不吃东西没奶怎么办 狗给扑倒了主人不想负责怎么办 山东政务网个人中心账号忘了怎么办 网易博客忘记登入名和密码了怎么办 奶水不够怎么办怎样让奶水变多 和初恋分手多年又爱上初恋该怎么办 分手六年的初恋想要和我复合怎么办 不小心把手机里的视频删了怎么办 网签过了中介不配合过户怎么办 房屋被中介恶意网签了怎么办 重介质选矿块矿品位低怎么办 去泰国酒吧选小姐只会说中文怎么办 脚被窝烫伤后发炎里面有龙怎么办 脚被窝烫了发炎有龙怎么办 辣椒落花的药喷到孩子嘴巴了怎么办 香炉里的小米生虫子了怎么办 香炉里面放的小米生虫子了怎么办 肉肉上长满了白色的小虫子怎么办 多肉上面有白色的虫子怎么办 多肉植物根部长白色虫子怎么办 朋友玩期货把我钱赔了怎么办 宝宝床上虫子咬了肿大包怎么办 喷药的杀虫剂的喷头坏了怎么办 宅e经营贷个人没有公司怎么办