Форматирование шестнадцатеричного числа в Javascript

У меня есть шестнадцатеричное число в javascript. Для отображения целей я хотел бы форматировать строку как:

ffffffff-ffff-ffff
00000000-0000-01ff

(8 цифр) - (4 цифры) - (4 цифры) с заполненными нулями спереди

Я пытаюсь написать свой собственный цикл для форматирования произвольного шестнадцатеричного числа в этот формат, но это похоже на то, что должно быть доступно в javascript. Есть ли встроенный способ форматирования шестнадцатеричного числа в javascript?

Спасибо!

Ответы

Ответ 1

Я бы сделал двухэтапный процесс:

1) преобразовать число в шестнадцатеричный шестнадцатеричный с начальными нулями:

var i = 12345; // your number
var h = ("000000000000000" + i.toString(16)).substr(-16);

2) добавить черточки

var result = h.substr(0, 8)+'-'+h.substr(8,4)+'-'+h.substr(12,4);

Ответ 2

В дополнение к ответу knabar:

Если ваш номер действительно полный 64 бита, вы должны знать, что javascript имеет только удвоения, которые превышают около 53 бит точности. Например.

var i = 0x89abcdef01234567; // a 64-bit constant
var h = ("000000000000000" + i.toString(16)).substr(-16); // "89abcdef01234800"

Итак, вы, вероятно, захотите разбить это на два 32-битных числа и отформатировать их по 8 цифр за раз. Затем возникает вторая оговорка: javascript выполняет побитовые операции с подписанными 32-битными целыми числами, и этот код форматирования не может обрабатывать отрицательные числа.

var i = 0xffd2 << 16; // actually negative
var h = ("0000000" + i.toString(16)).substr(-8); // "0-2e0000"

Поскольку вполне вероятно, что числа, которые вы хотите отформатировать в шестнадцатеричном виде, являются результатом побитовых манипуляций, код может быть изменен для печати в двух дополнениях:

var i = 0xffd2 << 16; // actually negative
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "ffd20000"

Это дает шестнадцатеричное представление нижних 32 бит неотъемлемой части произвольных положительных и отрицательных чисел. Вероятно, это то, что вы хотите (это примерно printf("%08x")). Некоторые более угловые случаи:

var i = 1.5; // non-integers are rounded
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "00000001"

var i = -1.5; // rounding is towards zero
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "ffffffff"

var i = NaN; // not actually a number
var h = ("0000000" + ((i|0)+4294967296).toString(16)).substr(-8); // "00000000"

Ответ 3

Версия ES6

function toPaddedHexString(num, len) {
    str = num.toString(16);
    return "0".repeat(len - str.length) + str;
}

var hexStr = toPaddedHexString(12345, 16);

Ответ 4

Я не думаю, что в чистом javascript есть что-то, связанное с этим, но фреймворки предоставляют этот метод, в ExtJS 3 он реализован таким образом

    /**
     * Pads the left side of a string with a specified character.  This is especially useful
     * for normalizing number and date strings.  Example usage:
     * <pre><code>
var s = String.leftPad('123', 5, '0');
// s now contains the string: '00123'
     * </code></pre>
     * @param {String} string The original string
     * @param {Number} size The total length of the output string
     * @param {String} char (optional) The character with which to pad the original string (defaults to empty string " ")
     * @return {String} The padded string
     * @static
     */
    leftPad : function (val, size, ch) {
        var result = String(val);
        if(!ch) {
            ch = " ";
        }
        while (result.length < size) {
            result = ch + result;
        }
        return result;
    }

Ответ 5

Я предполагаю, что число уже представлено в виде строки из-за ограничений, описанных в ответе hexwab. Если это не так, запустите процесс, введя его в шестнадцатеричную строку произвольной длины (называемую str), используя любой механизм, подходящий для вашей ситуации. Тогда:

(Array(16).join(0) + str).slice(-16).replace(/^.{8}|.{4}(?!$)/g,"$&-");