Qt将整型字符串格式化为固定位数的十进制字符串
·
注:本文是自己平时学习整理的资料,方便自己查阅,可能存在问题或知识涵盖不全,仅供参考。
一、需求分析及存在问题
需要将一个整型的数据转换为固定长度的字符串
数据库的字段如下:

我要获取右边列的数据(其数据类型为int)并在页面展示为4位字符串,目前是直接把int转为QString后显示的,可以看到只有3位。

二、所用方法
1.具体实现
QStringLiteral(%1).arg(原始数值,最小宽度,进制,填充字符)
QStringLiteral("%1").arg(nNameID, 4, 10, QChar('0'))
2.方法解释
2.1 核心作用
将整数类型的名称 ID(nNameID)格式化为一个固定 4 位的十进制数字字符串,若武器 ID 的位数不足 4 位,则在其左侧用字符 '0' 进行补全(即补零填充)。
比如:
- 若 nNameID = 12,格式化后结果为“0012”;
- 若 nNameID = 123,格式化后结果为“0123”;
- 若 nNameID = 1234,格式化后结果为“1234”;
- 若 nNameID = 12345,格式化后结果为“12345”;
2.2 逐部分拆解
- QStringLiteral:Qt 提供的字符串字面量宏,作用是编译期就将 C 风格字符串(这里是“%1”)直接构造为 Qt 的 QString 对象,而非运行时动态构造。相比于直接写QString("%1"),它能减少运行时内存开销、提高程序执行效率,时Qt中推荐的字符串字面量创建方式(尤其适用于字符串)。
- %1:这是 QString 的占位符,用于标记后续需要被替换的位置。%1表示第一个待替换参数,若有多个参数,可依次使用%2、%3……等。这里的%1会被后续 arg() 方法传入的格式化后的数据替换。
- arg(nNameID, 4, 10, QChar('0')):这是 QString 的重载 arg() 方法(专门用于数值格式化的重载版本),四个参数各自有明确含义,缺一不可(按参数顺序解析):
参数位置 参数值 参数含义 第 1 个 nNameID待格式化的原始数值(这里是名称 ID,整数类型,如 int/long 等)。 第 2 个 4最小宽度(minimum width):指定格式化后的字符串至少要占用 4 个字符长度。若原始数值转换后的字符串长度不足 4 位,会用填充字符补全;若超过 4 位,不会截断,完整保留。 第 3 个 10进制(base):指定原始数值的转换进制,这里 10 表示十进制(常用进制还有 2 = 二进制、8 = 八进制、16 = 十六进制)。 第 4 个 QChar('0')填充字符(fill character):当原始数值转换后的字符串长度不足最小宽度(4 位)时,用于补全空缺位置的字符,这里指定用字符 '0' 填充(默认填充字符是空格)。
2.3 补充说明
- 填充方向:该arg()重载版本默认左填充(即不足位数时,填充字符加在原始数字的左侧),这也是补零格式化(如固定 4 位、6 位编号)的常用方式。
- 类型兼容性:nNameID可以是任意整数类型(int、uint、long long 等),Qt 会自动进行类型适配转换。
3.和直接使用QString的差异
| 对比维度 | QStringLiteral("%1") | 直接使用 QString("%1") |
|---|---|---|
| 创建时机 | 编译阶段(程序编译时已完成字符串构造) | 运行阶段(程序执行到该行代码时才动态创建) |
| 底层原理 | 1. 编译期将 C 风格字符串 "%1" 直接转换为 QString 内部的 Unicode 数据格式;2. 字符串数据会被存储在程序的只读数据段(静态存储区),无需运行时动态分配堆内存;3. 构造 QString 时直接引用只读数据段的已有数据,无拷贝操作。 | 1. 运行时先识别 C 风格字符串 "%1"(存储在栈 / 只读段);2. 动态在堆内存中分配空间,用于存储 QString 所需的 Unicode 格式数据;3. 将 C 风格字符串的内容从原存储位置拷贝到堆内存的新空间中,完成 QString 构造。 |
| 内存开销 | 几乎无额外开销:无需堆内存分配,无数据拷贝成本 | 有明显额外开销:需要堆内存分配 / 释放,存在数据拷贝开销(即使是短字符串 "%1",也会触发 QString 的底层内存管理逻辑) |
| 性能表现 | 高性能:编译期完成初始化,运行时直接使用,无额外耗时 | 性能略低:运行时动态分配 + 拷贝,存在微小但可累积的耗时(高频使用时差异明显) |
| 数据存储位置 | 字符串原始数据存储在只读数据段(静态区),QString 对象仅持有该数据的引用 | 字符串数据存储在堆内存,QString 对象持有堆内存的指针 |
| 可修改性 | 若直接引用只读数据段,默认不可修改(修改时会触发 "写时拷贝",此时会动态分配堆内存拷贝数据后再修改) | 构造完成后可直接修改(数据存储在堆内存,修改无需额外触发拷贝) |
| 使用限制 | 仅支持常量字符串字面量(如 "abc"、"%1" 等编译期已知的固定字符串),不支持变量(如 char* str = "test"; QStringLiteral(str); 无效) | 支持常量字符串字面量、变量字符串(如 char* str = "test"; QString(str); 有效),无输入限制 |
三、实现效果

更多推荐
所有评论(0)