]> git.wincent.com - hextrapolate.git/blob - src/getDigits.js
fc8888da40fe64c3e8c0f7c202474400c8eac417
[hextrapolate.git] / src / getDigits.js
1 /**
2  * Copyright 2015-present Greg Hurrell. All rights reserved.
3  * Licensed under the terms of the MIT license.
4  *
5  * @flow
6  */
7
8 'use strict';
9
10 /**
11  * Strips the leading prefix from `number` in `base` and returns the remaining
12  * part of the string.
13  *
14  * - "0x" (or "0X") for hexadecimal numbers.
15  * - "0" for octal numbers.
16  *
17  * For all bases, leading whitespace is stripped.
18  */
19 function stripPrefix(number: string, base: number): string {
20   if (base === 16) {
21     return number.replace(/^\s*0x/i, '');
22   } else if (base === 8) {
23     return number.replace(/^\s*0/, '');
24   } else {
25     return number.replace(/^\s*/, '');
26   }
27 }
28
29 /**
30  * Breaks the string repsentation of `number` in `base` into an array of decimal
31  * digits (from least significant to most significant) for easier manipulation.
32  *
33  * For example, the hexadecimal representation `"40fa"` becomes `[10, 15, 0,
34  * 4]`.
35  */
36 export default function getDigits(number: string, base: number): Array<number> {
37   return stripPrefix(number, base).trim().split('').reverse().map(digit => {
38     const result = parseInt(digit, base);
39     if (isNaN(result)) {
40       throw new Error('Invalid digit `' + digit + '` for base `' + base + '`');
41     }
42     return result;
43   });
44 }