返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >更优雅的C++字符串格式化实现方法详解
  • 723
分享到

更优雅的C++字符串格式化实现方法详解

摘要

目录背景优化实现使用背景 在用c++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接的,

背景

在用c++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接的,代码可读性很差而且很容易拼接错误

    ostringstream sqlstr;
    sqlstr << "insert into virtual_item_info(id, platfORM, typeid, name, icon_url, act_url, "
              "desc_text, vm_typeid, vm_price, val_typeid, val_count, priority, show_type, param, "
              "combo, area, "
              "onshelf_time, offshelf_time, status, show_url, svga_url, mp4_url, remarks_info, "
              "shading_url, utime, has_green_dot, act_id, "
              "act_name, act_icon, act_name_lang_id, act_start_time, act_end_time, item_level, "
              "distribute_src, buy_to_use_duration, noble_lvl, name_lang_id, desc_lang_id, "
              "target_whitelist_id, target_whitelist_type, is_cp_shareable, act_link_type, "
              "act_show_type, item_lang_code)"
           << "values(" << item.id << "," << item.platform << "," << item.atypeid << ",'"
           << EscapeString(item.name) << "','" << EscapeString(item.iconurl) << "','"
           << EscapeString(item.actUrl) << "','" << EscapeString(item.desctext) << "',"
           << item.vmtypeid << "," << item.vmprice << "," << item.valtypeid << "," << item.valcount
           << "," << item.priority << "," << item.showType << ",'" << EscapeString(item.param)
           << "'," << item.isCombo << ",'" << EscapeString(item.area) << "',"
           << item.onshelftime << "," << item.offshelftime << "," << item.status << ",'"
           << EscapeString(item.showUrl) << "','" << EscapeString(item.svgaUrl) << "','"
           << EscapeString(item.mp4Url) << "','" << EscapeString(item.remarksInfo)
           << "', '" << EscapeString(item.shadingUrl) << "', " << butil::gettimeofday_s()
           << "," << item.hasGreenDot << ",'" << EscapeString(item.actId) << "','"
           << EscapeString(item.actName) << "','" << EscapeString(item.actIcon) << "','"
           << EscapeString(item.actNameLangId) << "'," << item.actStartTime << ","
           << item.actEndTime << "," << item.itemLevel << "," << item.distributeSrc << ","
           << item.buyToUseDuration << "," << item.nobleLevel << ",'"
           << EscapeString(item.nameLangId) << "','" << EscapeString(item.descLangId)
           << "','" << EscapeString(item.targetGroupWhiteListId) << "',"
           << item.targetGroupWhiteListType << "," << item.isCpShareable << "," << item.actLinkType
           << "," << item.actShowType << ",'" << EscapeString(item.itemLanGCode) << "')";

优化

参考python字符串格式化方式

"{} {}".format("hello", "world")

先写出完整的字符串,在需要替换的位置通过占位符{}保留, 最后将占位符替换为指定的参数

实现

本质是基于递归依次将字符转中的占位符{}替换为对应的参数

class StringUtil {
private:
    // 递归出口
    static void BuildFormatString(std::ostringstream& builder,
                                  const std::string& fmt_spec,
                                  std::string::size_type idx) {
        builder.write(fmt_spec.data() + idx, fmt_spec.size() - idx);
    }


    template <typename T, typename... Types>
    static void BuildFormatString(std::ostringstream& builder,
                                  const std::string& fmt_spec,
                                  std::string::size_type idx,
                                  const T& first,
                                  const Types&... args) {
        auto pos = fmt_spec.find_first_of("{}", idx);a
        if (pos == std::string::npos) {
            builder.write(fmt_spec.data() + idx, fmt_spec.size() - idx);
            return;
        }

        builder.write(fmt_spec.data() + idx, pos - idx);
        builder << first;
        BuildFormatString(builder, fmt_spec, pos + 2, args...);
    }

public:
    
    template <typename... Types>
    static std::string FormatString(const std::string& fmt_spec, const Types&... args) {
        std::ostringstream builder;
        BuildFormatString(builder, fmt_spec, 0, args...);
        return builder.str();
    }
};

使用

uint32_t ts = butil::gettimeofday_s();
string sql_formattor =
        "insert into tbl_user_relation_info(uid, gift_id, batch_id, relation_id, crc32_relation_id, status, peer_uid, relation_create_time, create_time, update_time, order_id) values({}, {}, {}, '', 0, 0, 0, 0, {}, {}, '{}')";
string sql = StringUtil::FormatString(sql_formattor, uid, giftId, batchId, ts, ts, orderId);

到此这篇关于更优雅的C++字符串格式化实现方法详解的文章就介绍到这了,更多相关C++字符串格式化内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 更优雅的C++字符串格式化实现方法详解

本文链接: https://lsjlt.com/news/210202.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 更优雅的C++字符串格式化实现方法详解
    目录背景优化实现使用背景 在用C++编写代码时,经常需要用到字符串拼接及格式化,尤其是在拼写sql语句时,目前大部分sql拼接方式都是通过ostringstream流一点一点拼接的,...
    99+
    2023-05-16
    C++实现字符串格式化 C++字符串格式化 C++字符串 C++格式化
  • Java字符串拼接的优雅方式实例详解
    目录背景String底层原理拼接的方法经典但有时不优雅的 +优点缺点业务一万能的StringBuilder线程安全的StringBuffer灵活的String.format()有点绿...
    99+
    2024-04-02
  • 详解Python的字符串格式化
    目录Python在字符串格式化的两种方式%,关于整数的输出%,关于浮点数的输出%,关于字符串的输出format格式化输出format,位置匹配(最常用)总结format,指定数据类型...
    99+
    2023-05-16
    Python字符串 字符串格式化
  • Python:format格式化字符串详解
    目录一、前言二、什么是format方法三、实例1、传递位置参数2、利用位置索引值传递参数3、利用关键词传递参数4、格式说明符5、千位分隔符6、其他总结一、前言 Python提供两种方...
    99+
    2024-04-02
  • Python实现字符串格式化的方法小结
    Python2.6+ 增加了str.format函数,用来代替原有的'%'操作符。它使用比'%'更加直观、灵活。下面详细介绍一下它的使用方法。 下面是使用'%'的例子: "" "PI is %f......
    99+
    2022-06-04
    小结 字符串 方法
  • 详解Python中的字符串格式化
    目录什么是字符串格式化,为什么需要这样做?程序中都有哪些格式化?占位符格式化第一种%占位符格式化第二种占位符格式化关键字格式化总结什么是字符串格式化,为什么需要这样做? 我们有时候...
    99+
    2024-04-02
  • Java实现字符串转为驼峰格式的方法详解
    字符串转为驼峰格式 构建工具类 package com.yt.common.util; import com.yt.common.dto.NameCode; import com.y...
    99+
    2024-04-02
  • c++11多种格式时间转化为字符串的方法实现
    1.打印系统当前时间,或者将系统当前时间转化为字符串 #include <iostream> #include <sstream> #include &l...
    99+
    2024-04-02
  • c语言字符串格式化的方法是什么
    在C语言中,字符串格式化是通过使用printf()函数和相关的格式控制符来完成的。格式控制符用于指定要打印或输出的数据类型和格式。 ...
    99+
    2023-10-28
    c语言
  • C C++ 题解LeetCode1417重新格式化字符串
    目录题目描述整理题意解题思路分析具体实现复杂度分析代码实现总结题目描述 题目链接:1417. 重新格式化字符串 给你一个混合了数字和字母的字符串 s,其中的字母均为小写英文字母。 请...
    99+
    2022-11-13
    C C++ 重新格式化字符串 C C++ 格式化字符串
  • Python格式化字符串的案例方法
    目录1.三种常用格式化字符串方式1.%作占位符2.使用format()3.使用 f 格式化2.字符串宽度和精度的写法1.%填充符表示法2.format()表示法3.字符串对齐方式1....
    99+
    2024-04-02
  • Python 创建格式化字符串方法
    目录格式化字符串Format 方法其它格式化字符串方法格式化字符串 当我们需要创建文本或文档时,我们往往希望能够将值正确格式化为结构化字符串。 Python提供了多种选项用...
    99+
    2024-04-02
  • python如何实现字符串的格式化
    这篇文章将为大家详细讲解有关python如何实现字符串的格式化,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。字符串的格式化name = "Chan" &n...
    99+
    2023-06-27
  • C++将字符串格式化的几种方式总结
    目录C++将字符串格式化的几种方式使用snprintf格式化字符串使用boost::format格式化字符串使用stringstream格式化字符串C++11的一个格式化字符串的黑科...
    99+
    2023-01-28
    C++字符串格式化 C++字符串 C++格式化
  • python如何实现字符串格式化
    这篇文章主要为大家展示了“python如何实现字符串格式化”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“python如何实现字符串格式化”这篇文章吧。字符串格式...
    99+
    2024-04-02
  • java &amp; Android 格式化字符串详解
    %1$s %1$d Android string (java & Android 格式化字符串) 1$s // String %1$d // int //R.strin...
    99+
    2022-06-06
    JAVA 字符串 格式化 字符 Android
  • Python基础之字符串格式化详解
    目录一、前言二、百分号2.1 通过位置传参2.2 通过关键字传参三、 format 方式3.1 参数数据类型3.2 传参的方式3.3 格式化的其他配置参数3.4 格式化时间一、前言 ...
    99+
    2024-04-02
  • Python字符串格式化实例讲解
    目录一、%-formatting二、str.format()三、f-Strings在Python 3.6之前,有两种将Python表达式嵌入到字符串文本中进行格式化的主要方法:%-f...
    99+
    2024-04-02
  • Python中字符串的格式化方法小结
    老办法 Python2.6之前,格式字符串的使用方法相对更简单些,虽然其能够接收的参数数量有限制。这些方法在Python3.3中仍然有效,但已有含蓄的警告称将完全淘汰这些方法,目前还没有明确的时间进度表。 ...
    99+
    2022-06-04
    小结 字符串 方法
  • Python3字符串的格式化方法怎么用
    本篇内容主要讲解“Python3字符串的格式化方法怎么用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Python3字符串的格式化方法怎么用”吧!一 介绍Tip...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作