Search code examples
c++stringdatedate-conversion

Issues converting one string to another


I want to convert date strVal="1992-12-12" or "1992-9-9" of the form to 19921212 & 19920909. For doing so I have written following piece of code in C/C++. But the trouble is it converts 1992-12-12 to 1992012012. Can anyone guide me as to how show i fix this bug? I may also have inputs of the form "1992-9" and I would like to convert it to 19920900. Or "1992" to "19920000"

stringstream     collectTimeBegin;

for (string::iterator it = strVal.begin(); it != strVal.end(); )
{
      if (*it != '-')
      {
             cout<< "\n -- *it=" << *it;
             collectTimeBegin << *it;
             it++;
      }
      else
      {
           stringstream    si("");
           stringstream    sj("");
           int             i;               

           it++;
           si << *(it + 1);
           sj<< *(it + 2);
           i = atoi((si.str()).c_str()), j = atoi((sj.str()).c_str());
           cout << "\n i=" << i << "\t j=" << j << "\n";
           if ((i == 4) || (i == 5) || (i == 6) || (i == 7) || (i == 8) || (i == 9))
           {
                 cout << "\n 1. *it=" << *it;
                 collectTimeBegin << *it;
                 it++;
           }
           else if ((j == 0) || (j == 1) || (j == 2) || (j == 3) || (j == 4) || 
                    (j == 5) || (j == 6) || (j == 7) || (j == 8) || (j == 9))
           {
                 string     str = "0";

                 cout << "\n 2. *it=" << *it;
                 collectTimeBegin << str;
                 collectTimeBegin << *it;
                 it++;
            }
       }
 }

Solution

  • Here's a solution using standard C++; it uses the same approach as Christian's: split the input based on the dashes, pad missing digits with 0s:

    #include <string>
    #include <sstream>
    #include <algorithm>
    
    int main()
    {
        std::string date = "1992-9-12";
    
        std::replace(date.begin(), date.end(), '-', ' ');   // "1992 9 12"
    
        std::istringstream iss(date);
        int year = 0, month = 0, day = 0;
    
        if (iss.good()) iss >> year;    // 1992
        if (iss.good()) iss >> month;   // 9
        if (iss.good()) iss >> day;     // 12
    
        std::ostringstream oss;
        oss.fill('0');
        oss.width(4); oss << year;
        oss.width(2); oss << month;
        oss.width(2); oss << day;
        std::string convertedDate = oss.str();  // 19920912
    }