将数字转换为双十进制,在JavaScript中将数字替换为12个字母中的一个

Convert a number to a duodecimal, replacing numbers to one of 12 letters in JavaScript

本文关键字:数字 一个 12个 十进制 替换 JavaScript 转换      更新时间:2023-09-26

我正在开发一个将列表中的数字替换为字母的系统。我用了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"

开始:

var a = 1885;  //number to convert
var v = []; //string array where duodecimal conversion is stored
var r = a%12; //obtain the remainder by division by 12
a -= r;
r = letter(r);  //obtain the corresponding letter for each decimal symbol
v = r+v;
a = a/12;
while (a>0){
  r = a%12;
  a -= r;
  r = letter(r);
  v = r+v;
  a = a/12;
}
console.log(v); // show solution in the console

function letter(r){
switch (r){
case 0:
    r = "y";
    break;
case 1:
    r = "a";
    break;
case 2:
    r = "b";
    break;
case 3:
    r = "c";
    break;
case 4:
    r = "d";
    break;
case 5:
    r = "e";
    break;
case 6:
    r = "f";
    break;
case 7:
    r = "g";
    break;
case 8:
    r = "h";
    break;
case 9:
    r = "i";
    break;
case 10:
    r = "j";
    break;
case 11:
    r = "k";
    break;
}
return r;
}
相关文章: