簡體   English   中英

C++ 如何將無符號的 integer 轉換為沒有千位分隔符的十六進制字符串

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM