我正在开发一个用字母替换列表中的数字的系统。我使用 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 下:
- 按F12。
- 复制粘贴上面的函数和代码。
- 按ENTER。
您应该看到以下几行:
1882 "YYT"
1883 "YYX"
1884 "YYY"
1885 "AAAA"
1886 "AAAB"
1887 "AAAC"
关于javascript - 将数字转换为十进制,将数字替换为 JavaScript 中的 12 个字母之一,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23212771/