Преобразовать строку даты и времени в целые числа в 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 );
}
6 ответов
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
иначе целое число, которое вы получите в конце, меньше ожидаемого (и, следовательно, может быть запутано для даты / времени в году 2AD).
Если ваш компилятор поддерживает функции 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;
}
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]);
}
}
Ну вот:
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));
Используйте замену строки, чтобы заменить ненужные символы без символов http://www.cplusplus.com/reference/string/string/replace/
Я бы не стал использовать 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
несколько раз может потребовать немного больше памяти.