2012-06-26 67 views
0

如何轉換convertint日期和時間字符串只是整數在C++

std :: string strdate =「2012-06-25 05:32:06.963」;

喜歡這個

的std :: string strintdate = 「20120625053206963」 有些事情//我基本上去掉 - ,:,空間和。

我想我應該使用strtok或字符串函數,但我無法做到這一點,任何人都可以幫我在這裏用sampel代碼。

,使我將其轉換爲無符號__int64使用

// crt_strtoui64.c 
#include <stdio.h> 

unsigned __int64 atoui64(const char *szUnsignedInt) { 
    return _strtoui64(szUnsignedInt, NULL, 10); 
} 

int main() { 
    unsigned __int64 u = atoui64("18446744073709551615"); 
    printf("u = %I64u\n", u); 
} 
+0

使用循環和轉換之前收集的數字?或者在C++中使用正則表達式11 – nhahtdh

回答

3
bool nondigit(char c) { 
    return c < '0' || c > '9'; 
} 

std::string strdate = "2012-06-25 05:32:06.963"; 
strdate.erase(
    std::remove_if(strdate.begin(), strdate.end(), nondigit), 
    strdate.end() 
); 

std::istringstream ss(strdate); 
unsigned __int64 result; 
if (ss >> result) { 
    // success 
} else { 
    // handle failure 
} 

順便說一句,以取代不必要的字符,你的表現爲64位int可能有點脆弱。確保日期/時間2012-06-25 05:32:06被輸入爲2012-06-25 05:32:06.000,否則您從結尾中獲得的整數小於預期值(因此可能會在第2年AD中的日期/時間混淆)。

+0

爲什麼不使用'isdigit()'? – jrok

+0

@jrok:因爲它是語言環境特定的,我不記得'operator >>是否也是。另外,因爲'isdigit'不接受負面的輸入,所以需要額外的演員,並附加一個額外的解釋。在''中有'isdigit'的模板版本,儘管如此,它避免了後者在使用前必須查看它的代價(無論如何)。 –

+0

有道理,ty。 – jrok

0

在這裏你去:

bool not_digit (int c) { return !std::isdigit(c); } 

std::string date="2012-06-25 05:32:06.963"; 
// construct a new string 
std::string intdate(date.begin(), std::remove_if(date.begin(), date.end(), not_digit)); 
0

我不會用strtok的。這裏只是用std::string成員函數一個相當簡單的方法:

std::string strdate = "2012-06-25 05:32:06.963"; 
size_t pos = strdate.find_first_not_of("1234567890"); 
while (pos != std::string::npos) 
{ 
    size_t endpos = strdate.find_first_of("1234567890", pos); 
    strdate.erase(pos, endpos - pos); 
    pos = strdate.find_first_not_of("1234567890"); 
} 

這是不是一個超級有效的方法,但它會奏效。

一個也許更有效的方法可能會使用一個字符串流...

std::string strdate = "2012-06-25 05:32:06.963"; 

std::stringstream out; 

for (auto i = strdate.begin(); i != strdate.end(); i++) 
    if (std::isdigit(*i)) out << *i; 

strdate = out.str(); 

我並沒有對時間和空間複雜度的承諾,但我懷疑使用string::erase多次可能涉及多一點的內存洗牌。

2

如果你的編譯器支持C++ 11周的特點:

#include <iostream> 
#include <algorithm> 
#include <string> 

int main() 
{ 
    std::string s("2012-06-25 05:32:06.963"); 
    s.erase(std::remove_if(s.begin(), 
          s.end(), 
          [](const char a_c) { return !isdigit(a_c); }), 
      s.end()); 
    std::cout << s << "\n"; 
    return 0; 
} 
0
std::string strdate = "2012-06-25 05:32:06.963"; 
std::string result =""; 
for(std::string::iterator itr = strdate.begin(); itr != strdate.end(); itr++) 
{ 
    if(itr[0] >= '0' && itr[0] <= '9') 
    { 
     result.push_back(itr[0]); 
    } 
} 
相關問題