作者spider391 (小乖)
看板C_and_CPP
標題[心得] string 轉 int、float、double、long ...
時間Tue Jul 13 16:34:06 2010
今天學弟問我個問題, "CString" 如何轉成 "long"
作業環境是在 Visual Studio 2005 & "Use Unicode Character Set"
學弟 google 的結果找到了一個 solution
CString showID = _T("1234");
long id = _ttol(showID);
我看了一下 code 有點... 這種 api 要怎麼記憶阿
我最多記得 C 用的 atoi 之類的 ~
每次寫的時候都要 google 太累了
我記得之前看書有個不錯的寫法,我花了一些時間重現出來~
基本想法如下:
CString showID = _T("1234");
wstring wstr = showID.XXX() // XXX 為 CString 轉 string 的成員函式
long id =
from_wstring<long>(wstr);
因為 CString 是 MFC 專用的,所以我寫一個通用的 string 轉 long
而 CString 只要再想辦法轉成 string 就好
[註: 上述說明 string 泛指 wstring or string]
CString showID = _T("1234");
long id =
from_wstring<long>(showID.GetBuffer(0));
// show.GetBuffer(0) 我是google的,有人知道更好的轉換方式嗎? CString -> string
我為 muti-byte 和 unicode 個寫個一個版本如下:
========================================
#include <iostream>
#include <string>
using namespace std;
template <typename T>
T from_string(const string& s)
{
istringstream is(s);
T t;
if(! (is >> t) ) throw "bad string";
return t;
}
template <typename T>
T from_wstring(const wstring& s)
{
wistringstream is(s);
T t;
if(! (is >> t) ) throw "bad string";
return t;
}
==========================================
這樣不管你要轉甚麼型態(不要太奇怪的= =)都很方便了
請安心服用XD
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 61.216.177.57
推 LPH66:這樣不會在 template resolve 的時候出現 ambiguous 問題嗎? 07/13 17:21
→ LPH66:(template 的各版本之間只差回傳型態) 07/13 17:21
→ loveme00835:丟字元指標變成作exception handling更麻煩= =而且沒 07/13 17:31
→ loveme00835:有在前面加上你會丟例外的宣告... 07/13 17:32
→ tinlans:你都用 istringstream 了,幹嘛不考慮 operator>> 07/13 17:43
→ tinlans:的 overloading,讓 argument 能傳乾淨一點? 07/13 17:44
→ tinlans:不然起碼針對 CString 做個特化版也行。 07/13 17:49
→ tinlans:但是最根本的問題還是在包那層 istringstream 根本沒必要 07/13 17:58
→ tinlans:,轉失敗丟 exception 會發生很多有的沒的問題。 07/13 17:59
→ Hubert:boost::lexical_cast ? 07/13 23:24
→ tinlans:附帶補充一下,轉失敗除了丟 exception, 07/14 08:20
→ tinlans:也能用 boost::optional 來包 return type。 07/14 08:21
→ spider391:謝謝 a 大~ 07/19 10:06