使用0-9,A-Z和a-x作为数字,将十进制数字(十进制)转换为六十进制(六十进制)的最佳方法是什么。
我打算用javascript编写代码,但感谢任何帮助。
用法示例:
>>decToSex(60);
"10"
>>decToSex(123);
"23"
>>decToSex(1000000);
"4bke"
>>decToSex(1234567.89);
"5gu7.rO"
我使用的最终代码,基于Paolo的回答:
var decToSex = function(){
var decToSexMap = ['0','1','2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z',
'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x'];
return function(number){
var negative = '';
if (number < 0){
var negative = '-';
}
number = number.toString().split('.');
var integer = Math.abs(number[0]);
var fraction = number[1];
var result = '';
do {
result = decToSexMap[integer % 60] + result;
integer = parseInt(integer / 60);
} while (integer > 0);
if (fraction){
var decimalPlaces = fraction.toString().length;
result += '.';
fraction = parseFloat('.' + fraction);
var x = 0;
do {
x++;
var res = (fraction * 60).toString().split('.');
result = result + decToSexMap[res[0]];
if (res[1]) {
fraction = parseFloat('.' + res[1]);
}
else {
break;
}
} while (x < decimalPlaces);
}
return negative + result;
}
}();
答案 0 :(得分:3)
这适用于提供的测试数据,但您可能希望对其进行更多测试:
<script>
var convert = new Array(0,1,2,3,4,5,6,7,8,9,'A','B','C','D','E','F','G','H','I','J','K',
'L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z','a',
'b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q',
'r','s','t','u','v','w','x');
function decToSex(num) {
var extract = num.toString().split('.');
num = extract[0];
var pieces = new Array();
do {
pieces.push(convert[num % 60]);
num = parseInt(num/60);
} while (num > 0);
pieces = pieces.reverse();
var rem = extract[1];
if(rem) {
rem = parseFloat('.' + rem);
var x = 0;
var dec = new Array();
do {
x++;
var res = (rem * 60).toString().split('.');
dec.push(convert[res[0]]);
if(res[1]) {
rem = parseFloat('.' + res[1]);
} else {
break;
}
} while (x < 3); // work up to 3 decimal places, change for more.
}
var myResult = pieces.join('');
if(dec) {
myResult += '.' + dec.join('');
}
return myResult;
}
alert(decToSex(60));
alert(decToSex(123));
alert(decToSex(1000000));
alert(decToSex(1234567.89));
</script>
答案 1 :(得分:1)
对于它的价值,这里是对转换为最多64个基础的解决方案的修改:
// Convert decimal into a base between 2 and 64
var decToBase = function() {
var decToBaseMap = [
'0', '1', '2', '3', '4', '5', '6', '7', '8', '9',
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'Y', 'Z',
'+', '/'];
return function(number, base) {
if (base < 2 || base > 64) {
return "#base should be between 2 and 64#";
}
var negative = '';
if (number < 0) {
negative = '-';
}
number = number.toString().split('.');
var integer = Math.abs(number[0]);
var fraction = number[1];
var result = '';
do {
result = decToBaseMap[integer % base] + result;
integer = parseInt(integer / base, 10);
} while (integer > 0);
if (fraction) {
var decimalPlaces = fraction.toString().length;
result += '.';
fraction = parseFloat('.' + fraction);
var x = 0;
do {
x++;
var res = (fraction * base).toString().split('.');
result = result + decToBaseMap[res[0]];
if (res[1]) {
fraction = parseFloat('.' + res[1]);
}
else {
break;
}
} while (x < decimalPlaces);
}
return negative + result;
};
}();
alert(decToBase(2011, 64)); // displays "VR"
你可以在这里玩它: http://jsfiddle.net/kaicarver/d3Zn2/
答案 2 :(得分:0)
重复将其除以60,直到你为零。每次,获取模数,并将其转换为适当的字符,并将其添加到输出字符串。
编辑:对于小数,请说您正在搜索最多3个60位的地方:
从0.98765(基数10)开始
0.98765 * 60 -> 59.259 -> first post-decimal character is 59 converted to its 60decimal character, then carry the .259
.259 * 60 -> 15.54 -> second char is 15 converted to its 60decimal character, then carry the .54
.54 * 60 -> 32.4 -> round it this time (its the last char) -> last char is 32 as its 60dec char
因此0.98765(基数10)变为0. [59] [15] [32](基数60)
答案 3 :(得分:0)
首先将数字拆分为整数和小数部分。
对于整数部分,取模数拉出最低有效数字,然后除以60并重复。
对于小数部分,重复乘以60并取整数部分得到结果数字。如果你最终得到零,这是不可能的,你就完成了。您提取一定数量的数字后,您可能希望终止。