โดยปกติเมื่อเราแปลงทศนิยมเป็นเลขฐานสิบหก (ฐาน 16) เราใช้ set0123456789ABCDEF เพื่อจับคู่ตัวเลข
เราจำเป็นต้องเขียนฟังก์ชันที่ทำสิ่งเดียวกันทุกประการ แต่ให้ผู้ใช้มีอิสระในการใช้มาตราส่วนใดๆ มากกว่าที่จะกล่าวข้างต้น
ตัวอย่างเช่น −
The hexadecimal notation of the decimal 363 is 16B But if the user decides to use, say, a scale ‘qwertyuiopasdfgh’ instead of ‘0123456789ABCDEF’, the number 363, then will be represented by wus
นั่นคือสิ่งที่เราต้องทำ
ลองทำสิ่งนี้โดยสร้างฟังก์ชัน toHex() ที่ใช้การเรียกซ้ำเพื่อสร้างฐานสิบหกจากจำนวนเต็ม เพื่อความชัดเจน จะต้องใช้อาร์กิวเมนต์สี่ข้อ แต่จากสี่ข้อนั้น มีเพียงสองข้อแรกเท่านั้นที่จะใช้งานสำหรับผู้ใช้ปลายทาง
อันดับแรกจะเป็นตัวเลขที่จะแปลงเป็นเลขฐานสิบหก และอันดับที่สองคือมาตราส่วนที่กำหนดเอง จะเป็นทางเลือก และหากมีให้มา ควรเป็นสตริงที่มีอักขระ 16 ตัวพอดี มิฉะนั้นฟังก์ชันจะส่งกลับค่าเท็จ อาร์กิวเมนต์อีกสองอาร์กิวเมนต์คือ hexString และ isNegative ซึ่งตั้งค่าเป็นสตริงว่างและบูลีนตามลำดับโดยค่าเริ่มต้น
ตัวอย่าง
const num = 363; const toHex = ( num, hexString = '0123456789ABCDEF', hex = '', isNegative = num < 0 ) => { if(hexString.length !== 16){ return false; } num = Math.abs(num); if(num && typeof num === 'number'){ //recursively append the remainder to hex and divide num by 16 return toHex(Math.floor(num / 16), hexString, `${hexString[num%16]}${hex}`, isNegative); }; return isNegative ? `-${hex}` : hex; }; console.log(toHex(num, 'QWERTYUIOPASDFGH')); console.log(toHex(num)); console.log(toHex(num, 'QAZWSX0123456789'))
ผลลัพธ์
ผลลัพธ์ในคอนโซลจะเป็น -
WUS 16B A05