【发布时间】:2023-01-26 19:07:42
【问题描述】:
为了存储按钮文本的颜色,我将变量uint32_t textColor 设置为值 0xF5CE52 (0d16109138)。现在我需要将此 textColor 值作为十六进制值插入到字符串中。但是,当我尝试通过字符串流将 textColor 转换为十六进制字符串时,似乎在十六进制字符串中插入了千位分隔符,我无法弄清楚如何防止这种情况发生......
要将 textColor 转换为十六进制字符串,我使用了以下代码:
uint32_t textColor = 0xF5CE52;
stringstream btnColorHex;
btnColorHex << uppercase << setfill('0') << setw(6) << hex << textColor;
我使用以下方法打印它:
cout << "btnColorHex.str() - " << btnColorHex.str() << endl;
结果如下:
btnColorHex.str() - F5C.E52
注意:我已将我的系统区域设置为荷兰语格式的数字格式,它使用 .作为千位分隔符和 , 作为小数点分隔符。
我希望将以下内容打印到控制台:
btnColorHex.str() - F5CE52
我通过删除 .之后从字符串中提取,但是当我在 PC 上测试这段代码时,当我使用 , 作为千位分隔符将语言环境设置为美国格式时,这当然不起作用。
我也尝试过将 uint32_t 转换为 unsgined int,但这导致了同样的问题。
我可以尝试使用纯 C 中的 sprintf() 之类的函数来规避此问题,但如果有合适的 C++ 方法可以先执行此操作,我现在就想这样做。
所以我的问题是:C++ 中是否有一种方法可以将无符号整数格式化为十六进制字符串,而无需插入千位分隔符?
【问题讨论】:
-
您是否尝试过在您的应用中禁用区域设置?试试
btnColorHex.imbue(std::locale("C")); -
由于 C++11
std::sprintf是 C++ 标准的一部分。 Link cppreference。也就是说,我会改用snprintf。
标签: c++ string formatting integer hex