javascript - 将数字转换为十进制,将数字替换为 JavaScript 中的 12 个字母之一

标签 javascript string

我正在开发一个用字母替换列表中的数字的系统。我使用 12 个字母,例如 ABCEHKMOPTXY。所以这样的替换需要使用十二进制数格式。

这是所需的转换结果表:

1 – A
2 - B
3 - C
...
11 - X
12 - Y
13 - AA
14 - AB
...
48 - CY
49 - EA
...
156 - YY
157 - AAA
158 - AAB

我尝试使用 .toString(12) 将数字转换为十二进制,然后使用 switch - case 将结果中的每个字符替换为字母,但是有难以处理十进制整数,例如 1884 的结果。

1883 - YYX
1884 - AYY **- WRONG! Has to be YYY**
1885 - AAAA

这是我的函数,适用于 1884 年之前的数字,但我需要更通用的函数。请帮忙!

function numToString (num) {
    var duodecimal = (+num).toString(12);
    var numArray=duodecimal.split('');
    var lttrs='';
    for (var i=0; i<numArray.length; i++) {

        switch (numArray[i]) {
             case '1':
                 lttrs+='A'
                break
            case '2':
                lttrs+='B'
                break
            case '3':
                lttrs+='C'
                break
            case '4':
                lttrs+='E'
                break
            case '5':
                lttrs+='H'
                break
            case '6':
                lttrs+='K'
                break
            case '7':
                lttrs+='M'
                break
            case '8':
                lttrs+='O'
                break
            case '9':
                lttrs+='P'
                break
            case 'a':
                lttrs+='T'
                break
            case 'b':
                lttrs+='X'
                break
            case '0':
                lttrs=lttrs.slice(0,-1);
                switch (numArray[i-1]) {
                    case '1':
                        if (numArray[i-2]) {lttrs=lttrs.slice(0,-1); lttrs+='Y'}
                        break
                    case '2':
                        lttrs+='A'
                        break
                    case '3':
                        lttrs+='B'
                        break
                    case '4':
                        lttrs+='C'
                        break
                    case '5':
                        lttrs+='E'
                        break
                    case '6':
                        lttrs+='H'
                        break
                    case '7':
                        lttrs+='K'
                        break
                    case '8':
                        lttrs+='M'
                        break
                    case '9':
                        lttrs+='O'
                        break
                    case 'a':
                        lttrs+='P'
                        break
                    case 'b':
                        lttrs+='T'
                        break
                    case '0':
                        lttrs=lttrs.slice(0,-1);

                        lttrs+='X'
                        break
                }
                lttrs+='Y'
                break
         }
    }
    return lttrs;
}

最佳答案

我想我明白了:

function n2s(n, digits) {
    var s = '';
    var l = digits.length;
    while (n > 0) {
        s = digits.charAt((n - 1) % l) + s;
        n = Math.ceil(n / l) - 1;
    }
    return s;
}

在 Chrome 控制台中进行检查:

var i, letters = 'ABCEHKMOPTXY';
for (i = 1; i <= 25; i++) console.log(i, n2s(i, letters));
console.log(1884, n2s(1884, letters)); // 1884 "YYY"
console.log(1885, n2s(1885, letters)); // 1885 "AAAA"

相关内容:https://stackoverflow.com/a/30687539/1636522 .

不过我有点晚了:-|

<小时/>

反转功能

我必须承认对我来说仍然有一点魔力,那么我不确定是否能够向您完整解释这里发生的事情:-D 无论如何,按照您的要求,这里是反向函数:

function s2n(s, digits) {
    var pow, n = 0, i = 0;
    while (i++ < s.length) {
        pow = Math.pow(digits.length, s.length - i);
        n += (digits.indexOf(s.charAt(i - 1)) + 1) * pow;
    }
    return n;
}

顺便说一句,这是一个用例:

var letters = 'ABCEHKMOPTXY';
var from = s2n('YYT', letters);
var to = s2n('AAAC', letters);
for (var n = from; n <= to; n++) {
    console.log(n, n2s(n, letters));
}

在 Chrome 或 Firefox 下:

  1. F12
  2. 复制粘贴上面的函数和代码。
  3. ENTER

您应该看到以下几行:

1882 "YYT"
1883 "YYX"
1884 "YYY"
1885 "AAAA"
1886 "AAAB"
1887 "AAAC"

关于javascript - 将数字转换为十进制,将数字替换为 JavaScript 中的 12 个字母之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23212771/

相关文章:

javascript - 除非调整窗口大小,否则 iFrame 不会在 Chrome 中加载

javascript - 如何在不调用其构造函数的情况下复制对象及其原型(prototype)链?

javascript - 如何使用嵌套数组对象访问 d3 json 文件中的值

javascript - 如何从 React Native 中的函数返回值

string - 8086中如何将键盘输入加载到数组中?

c - 在C中使用字符串数组的数组来解析文本文件

python - Pandas :计算一列中的空字符串

php - 如何从点击链接时调用的 JS 调用 PHP 函数?

python - 如何在 Python 中合并两个 json 字符串?

c++ - 对于每个循环只取数组 C++ 的第一个字符串