如何使用字符串流格式化十六进制数字
Posted
技术标签:
【中文标题】如何使用字符串流格式化十六进制数字【英文标题】:how to format hex numbers using stringstream 【发布时间】:2014-09-28 08:54:12 【问题描述】:我正在尝试使用 stringstream 将 unsigned short 转换为其十六进制表示形式,并以 0 为前缀。我似乎无法正确理解大写字母和 0。这是我现在拥有的:
USHORT id = 1127;
std::stringstream ss;
ss << std::showbase << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << id;
std::string result = ss.str();
这导致前缀 '0x' 基数也为大写,但我希望它为小写。它还导致前缀 0x 基数(当前为 0X)之后的十六进制值没有前缀 0。例如,这将输出 0X467 而不是预期的 0x0467。我该如何解决这个问题?
【问题讨论】:
【参考方案1】:setw
将设置整个格式化输出的宽度,包括显示的基数,这就是您看不到前导 0
的原因。此外,如果您使用std::showbase
和std::uppercase
,则无法将base 显示为小写。解决方法是手动插入底座,然后应用剩余的机械手。
ss << "0x" << std::uppercase << std::setfill('0') << std::setw(4) << std::hex << id;
这会输出0x0467
【讨论】:
顺便提一下std::internal 可用于获取基数和数字之间的填充字符(但如果您想要不同大小写的基数和数字,则无济于事)。以上是关于如何使用字符串流格式化十六进制数字的主要内容,如果未能解决你的问题,请参考以下文章
LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化