Форматирование шестнадцатеричного числа в Javascript - PullRequest
19 голосов
/ 28 марта 2012

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

ffffffff-ffff-ffff
00000000-0000-01ff

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

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

Спасибо!

Ответы [ 5 ]

48 голосов
/ 28 марта 2012

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

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

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);
14 голосов
/ 12 мая 2013

В дополнение к ответу Кнабара:

Если ваше число на самом деле составляет целые 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"
9 голосов
/ 13 февраля 2017

Версия ES6

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

var hexStr = toPaddedHexString(12345, 16);
1 голос
/ 28 марта 2012

Я не думаю, что в чистом 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'
     * 
* @param {String} string Исходная строка * @param {Number} size Общая длина выходной строки * @param {String} char (необязательно) Символ, с помощью которого можно дополнить исходную строку (по умолчанию пустая строка "") * @return {String} Мягкая строка * @static * / leftPad: function (val, size, ch) { var result = String (val); if (! ch) { ch = ""; } while (result.length
0 голосов
/ 15 ноября 2016

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

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