将数字转换为双十进制,在JavaScript中将数字替换为12个字母中的一个
Convert a number to a duodecimal, replacing numbers to one of 12 letters in JavaScript
我正在开发一个将列表中的数字替换为字母的系统。我用了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"
开始:
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;
}
相关文章:
- 递增一个数字而不去掉前导零
- 如何为jQuery屏蔽输入插件创建一个允许字母数字、空格和重音字符的掩码
- 我想在AngularJS应用程序中创建一个输入数字框,用户不应该在该框上键入十进制数字.(一个整数输入框)
- 制作一个regex来验证只有一个数字的字符串
- 如何限制一个字段只接受4个数字字符作为输入,并获得'It’这是潜水警报
- 为什么这个正则表达式不't匹配最后一个字母数字字符
- 一个jquery验证器方法,它不接受纯数字或纯特殊字符,但接受上面是否有字母
- 如何拆分一个整数和产生的所有数字来创建一个新数字
- 如何使用至少一个数字、一个大写字母和6-20个字符验证密码
- 当与另一个实例进行比较时,我的类实例如何隐式返回数字
- 简单的Javascript方式,在输入字段的每5位数字后添加一个空格
- 有没有办法在里面看到一个数字'的64位浮点IEEE754表示
- PHP函数识别3个数字中最低的一个并更改其类
- 我如何解析二's是一个数字的补码字符串
- 为什么我需要在这里输入var,为什么它会给我一个数字作为答案?(Javascript)
- 在我的网站上创建一个在1-10之间不断变化的数字时遇到了问题.Javascript
- 如何获取一个以零开头的数字的位数
- 如何创建一个确定2个数字之间值的函数
- 当我添加一个新数字时,如何获得一些数字的即时平均值
- 为什么 JavaScript 如果一个数字有一个前导零,就将其视为八进制