[英]C++ How to convert an unsigned integer to a hex string without a thousands separator
為了存儲按鈕文本的顏色,我將變量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;
結果如下 output:
btnColorHex.str() - F5C.E52
注意:我已將我的系統區域設置為使用荷蘭語格式設置數字格式。 作為千位分隔符,作為小數點分隔符。
我希望將以下內容打印到控制台:
btnColorHex.str() - F5CE52
我通過刪除“解決”了這個問題。 之后從字符串中提取,但是當我在 PC 上測試此代碼時,將語言環境設置為美國格式,使用千位分隔符,當然這不起作用。
我也試過將uint32_t
轉換為unsgined int
,但這導致了同樣的問題。
我可以嘗試使用普通 C 中的sprintf()
之類的函數來規避此問題,但我想現在是否有適當的 C++ 方法首先執行此操作。
所以我的問題是:C++ 中有沒有辦法將無符號的 integer 格式化為十六進制字符串,而不插入千位分隔符?
要禁用區域設置格式,請使用imbue(std::locale("C"))
您的代碼現在將如下所示:
uint32_t textColor = 0xF5CE52;
stringstream btnColorHex;
btnColorHex.imbue(std::locale("C"));
btnColorHex << uppercase << setfill('0') << setw(6) << hex << textColor;
現在,無論 PC 的區域設置如何,output 都將始終正確格式化:
btnColorHex.str() - F5CE52
你可以手寫這個作為
#include <cstdint>
#include <cstdlib>
#include <iostream>
std::string hex( uint32_t value ) {
char str[16];
char* p = &str[16];
do {
p--;
uint32_t digit = value % 16;
value /= 16;
*p = digit>=10 ? 'a' + (digit-10) : '0' + digit;
} while ( value > 0 );
p--;
*p = 'x';
p--;
*p = '0';
return std::string(p,&str[16]-p);
}
運行為
int main()
{
for ( int j=0; j<10; ++j ) {
uint32_t value = std::rand();
std::cout << std::hex << value << " " << hex( value ) << std::endl;
}
}
產品
6b8b4567 0x6b8b4567
327b23c6 0x327b23c6
643c9869 0x643c9869
66334873 0x66334873
74b0dc51 0x74b0dc51
19495cff 0x19495cff
2ae8944a 0x2ae8944a
625558ec 0x625558ec
238e1f29 0x238e1f29
46e87ccd 0x46e87ccd
Godbolt: https://godbolt.org/z/xxEnqs7es
另一種選擇是使用 C++20 的std::format
。 然而目前只有 gcc/clang on trunk (unreleased) 實現了這個特性。
#include <format>
std::string hex( uint32_t value ) {
return std::format("0x{:x}", value);
}
Godbolt: https://godbolt.org/z/roMc5ajcj
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.