【问题标题】:string representing date and transform it表示日期的字符串并对其进行转换
【发布时间】:2019-09-28 01:03:17
【问题描述】:

要格式化表示从其他部分接收到的日期的字符串,需要进行一些转换:

source:
    std::string s = "20190510";
target:
    std::string t = "05/10/2019";

一种方法是逐个字符地复制,有没有一种优雅的方法可以让它既美观又快速?

更新:抱歉,转换应该是从“yyyymmdd”到“mm/dd/yyyy”。

【问题讨论】:

  • 使用boost::format怎么样?
  • 抱歉不能使用 boost

标签: c++ string c++11 stdstring


【解决方案1】:

试试insert:

int main() {
    std::string s = "20190510";
    s.insert(4, "/");
    s.insert(7, "/");
    std::cout << s << std::endl;
}

【讨论】:

  • insert 涉及移动整个内存块,对吗?有没有更好的办法?
  • 任何将字符添加到字符串的操作都可能使它移动内存,如果它不再适合的话。至少插入位置之后的字符无论如何都必须移动。我不认为标准规定必须如何实现insert,但我想它应该相当有效并且避免明显的性能缺陷。
  • 对不起,我用错了例子,更新了我的帖子,这是我的错
【解决方案2】:

如果您不想修改或复制字符串,则只有在需要时才可以选择格式化。这可以通过一个小工具来完成:

struct date_format {
    std::string const& str;
    date_format(std::string const& str) : str(str) {}
    friend std::ostream& operator<< (std::ostream& os, date_format const& df) {
        return os.write(&df.str[4], 2)
                 .put('/')
                 .write(&df.str[6], 2)
                 .put('/')
                 .write(&df.str[0], 4);
    }
};

像这样使用,例如std::cout &lt;&lt; date_format(source);see it live

否则肯定需要复制或移动角色。

【讨论】:

  • 这也适用于字符串流,对吧?如果我想保留结果而不是打印它,只是为了确认。
  • @fluter - 是的。一般的ostream 参数使之成为可能。您也可以使用此实用程序来获取格式化的副本。
猜你喜欢
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 2019-12-19
  • 1970-01-01
  • 1970-01-01
  • 2023-03-05
  • 2020-05-21
相关资源
最近更新 更多