如何在不使用toString的情况下使用JavaScript在自定义n长度字符集中打印n位数字

时间:2019-02-06 15:00:33

标签: javascript string integer

以同样的方式,我们使用字符123456789abcdef来获取十六进制的“数字”,您只需执行integer.toString(16)即可将整数转换为十六进制:

> (16).toString(16)
'10'

...我想改用自定义字符集和自定义基数。因此,对于十六进制,我想使用字符13579acegikmoqsu,那么将是这样的:

> (16).toString(16, '13579acegikmoqsu')
'ik'

实际上,我不知道在这种情况下的输出值是多少。但是我正在寻找如何用JavaScript做到这一点。

十六进制之外的另一个示例是,例如,使用字符集and123将以6为基数的数字转换为字符串,因此将是这样的:

> (16).toString(6, 'and123')
'a3d'

我也不知道这里的值是什么,我也不知道如何计算它。基本上想知道如何在JavaScript中执行此操作,而不必使用此toString API,最好是更底层,以便我也可以理解其背后的逻辑。

同样,知道如何反转它也很有帮助,因此可以像这个伪示例一样从a3d => 16开始。

1 个答案:

答案 0 :(得分:4)

您可以将整数值的字符值映射为索引

function toString(n, characters) {
    var radix = characters.length;
    return Array
        .from(n.toString(radix), v => characters[parseInt(v, radix)])
        .join('');
}
 
console.log(toString(16, '13579acegikmoqsu')); // 31

没有toStringparseInt的版本。

function toString(n, characters) {
    var radix = characters.length,
        temp = [];

    do {
        temp.unshift(n % radix);
        n = Math.floor(n / radix);
    } while (n)

    return temp
        .map(i => characters[i])
        .join('');
}
 
console.log(toString(16, '13579acegikmoqsu')); // 31