Форматирование шестнадцатеричного числа в 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,"$&-");