Функция parseInt()
Чтобы преобразовать шестнадцатеричное число в десятичное, вызовите функцию parseInt()
, передав шестнадцатеричное число и 16
в качестве первого и второго аргументов: parseInt(hex, 16)
. Например:
function hexToDec(hex) { return parseInt(hex, 16); } console.log(hexToDec('f')); // 15 console.log(hexToDec('abc')); // 2748 console.log(hexToDec(345)); // 837
Функция parseInt()
анализирует строку и возвращает целое число указанного радикса. Она имеет два параметра.
string
— анализируемая строка.radix
— целое число от 2 до 36, представляющее собой радикс/базис строки.
Функция parseInt()
игнорирует пробелы в переданной ей строке.
console.log(parseInt(' a', 16)); // 10
console.log(parseInt(' cd', 16)); // 205
Если переданная строка не является допустимым числом в указанном радиксе, parseInt()
не выдает ошибку, а возвращает NaN
.
console.log(parseInt('js', 16)); // NaN // 'a' не существует в базисе 10 console.log(parseInt('a', 10)); // NaN // 5 не существует в базисе 2 console.log(parseInt(5, 2)); // NaN
Если радикс не находится в диапазоне между 2 и 36, то функция parseInt()
также вернет NaN
.
console.log(parseInt(54, 1));
console.log(parseInt('aa', 37));
console.log(parseInt(10, 50));
Если радикс является недопустимым числом или не установлен, а строка начинается с 0x
или 0X
, то радикс принимается равным 16. Если же строка начинается с любого другого значения, радикс принимается равным 10.
// предполагается базис 10 console.log(parseInt('45')); // 45 console.log(parseInt('36', 'invalid')); // 36 // 'f' и 'b' НЕ существуют в предполагаемом базисе 10 console.log(parseInt('ff')); // NaN console.log(parseInt('bb', 'invalid')); // NaN // 'f' и 'b' существуют в предполагаемом базисе 16 console.log(parseInt('0xff')); // 255 console.log(parseInt('0Xbb', 'invalid')); // 187
Пример: преобразование шестнадцатеричного кода в RGB(A)
Одним из распространенных способов конвертирования шестнадцатеричных значений в десятичные является преобразование шестнадцатеричного кода цвета в его эквивалент в формате RGB. Вот как это можно сделать:
function hexToDec(hex) { return parseInt(hex, 16); } function hexToRGB(hexColor) { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexColor); return { r: hexToDec(result[1]), g: hexToDec(result[2]), b: hexToDec(result[3]), }; } // { r: 255, g: 128, b: 237 } console.log(hexToRGB('#ff80ed')); // { r: 195, g: 151, b: 151 } console.log(hexToRGB('#c39797')); // { r: 255, g: 255, b: 255 } console.log(hexToRGB('#ffffff'));
Мы создали многократно используемую функцию hexToRGB()
, чтобы эту логику можно было легко повторить.
Мы используем регулярное выражение для поиска и разделения двухбуквенного кода, обозначающего красный (R), зеленый (G) и синий (B) цвета. Вызываем метод exec()
, чтобы найти совпадения этого регулярного выражения в указанном шестнадцатеричном коде цвета:
/**
[
'#ff80ed',
'ff',
'80',
'ed',
index: 0,
input: '#ff80ed',
groups: undefined
]
*/
console.log(/^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec('#ff80ed'));
После их разделения используем метод hexToDec()
для преобразования каждого из них в его десятичный эквивалент.
Мы возвращаем объект со свойствами r
, g
и b
, содержащими значения для красного, зеленого и синего цветов соответственно.
В зависимости от конкретного случая мы также можем вернуть строку rgb()
вместо объекта. Зачастую это уместно для цветной анимации, поскольку некоторые библиотеки анимации работают со значениями RGB, а не с шестнадцатеричными кодами цветов.
function hexToDec(hex) { return parseInt(hex, 16); } function hexToRGB(hexColor) { const result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(hexColor); const r = hexToDec(result[1]); const g = hexToDec(result[2]); const b = hexToDec(result[3]); return `rgb(${r}, ${g}, ${b})`; } // rgb(255, 128, 237) console.log(hexToRGB('#ff80ed')); // rgb(195, 151, 151) console.log(hexToRGB('#c39797')); // rgb(255, 255, 255) console.log(hexToRGB('#ffffff'));
Мы можем модифицировать функцию для определения альфа-значения в шестнадцатеричном коде и преобразования кода цвета в формат RGBA. Будем использовать альфа-значение 1
, если оно не указано.
function hexToDec(hex) { return parseInt(hex, 16); } function hexToRGBA(hexColor) { const regex = /^#?([a-f\d]{2})?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i; const result = regex.exec(hexColor); const alphaHex = result[1]; const a = alphaHex ? hexToDec(alphaHex) / 255 : 1; const r = hexToDec(result[2]); const g = hexToDec(result[3]); const b = hexToDec(result[4]); return { r, g, b, a }; } // { r: 255, g: 128, b: 237, a: 1 } console.log(hexToRGBA('#ff80ed')); // { r: 195, g: 151, b: 151, a: 1 } console.log(hexToRGBA('#c39797')); // { r: 255, g: 128, b: 237, a: 0.8666666666666667 } console.log(hexToRGBA('#ddff80ed')); // { r: 195, g: 151, b: 151, a: 0.6901960784313725 } console.log(hexToRGBA('#b0c39797'));
Можно также возвращать строку rgba()
вместо объекта:
function hexToDec(hex) { return parseInt(hex, 16); } function hexToRGBA(hexColor) { const regex = /^#?([a-f\d]{2})?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i; const result = regex.exec(hexColor); const alphaHex = result[1]; const a = alphaHex ? hexToDec(alphaHex) / 255 : 1; const r = hexToDec(result[2]); const g = hexToDec(result[3]); const b = hexToDec(result[4]); return `rgba(${r}, ${g}, ${b}, ${a.toFixed(3)})`; } // rgba(255, 128, 237, 1.000) console.log(hexToRGBA('#ff80ed')); // rgba(195, 151, 151, 1.000) console.log(hexToRGBA('#c39797')); // rgba(255, 128, 237, 0.867) console.log(hexToRGBA('#ddff80ed')); // rgba(195, 151, 151, 0.690) console.log(hexToRGBA('#b0c39797'));
Читайте также:
- 11 сверхполезных советов для JavaScript разработки
- Манипуляции с битами. Игра в истину
- Как удалить одинаковые данные из отсортированного массива
Читайте нас в Telegram, VK и Дзен
Перевод статьи Coding Beauty: How to Convert Hex to Decimal in JavaScript