将数字转换为字符串(Charset提供)JavaScript

时间:2016-03-31 03:29:44

标签: javascript

更新

以下代码完美无缺,直到$ char.to_text遇到大于54,634,574,847的整数。

alpha="abcdefghijklmnopqrstuvwxyz";
$char={
    to_num:function(s,c){
        var l=c.length,o={};
        c.split('').forEach(function(a,i){
            o[a]=i
        });
        return s.split('').reduce(function(r,a){
            return r*l+o[a]
        },0)
    },
    to_text:function(i,c){
        var l=c.length,s='';
        do{
            s=c[i%l]+s; // i%l
            i/=l;
            i|=0
        }while(i!==0);
        return s
    }
};

这是一个快速剪辑:

$char.to_num("military",alpha) => 98987733674
$char.to_text(98987733674,alpha) => "undefinedundefinedundefinedundefinedundefinedundefinedundefinedy"

手动迭代上面的代码应该生成一个正常的响应,为什么它会产生这个“undefined ...”字符串,是不是因为它是JS的大量操作?

2 个答案:

答案 0 :(得分:2)

这是一个包含重写hash函数的提案,它使用对象o作为简化indexOf,并使用简单的循环作为返回值。

想要的函数ihash使用单个do ... until循环。它使用值的剩余部分和长度作为给定字符集的索引。然后将该值除以该字符集的长度,如果不等于零,则将整数部分用于下一次迭代。



function hash(s) {
    var c = '0abcdefghijklmnopqrstuvwxyz',
        l = c.length,
        o = {};

    c.split('').forEach(function (a, i) {
        o[a] = i;
    });
    return s.split('').reduce(function (r, a) {
        return r * l + o[a];
    }, 0);
}

function ihash(i) {
    var c = '0abcdefghijklmnopqrstuvwxyz',
        l = c.length,
        s = '';

    do {
        s = c[i % l] + s;
        i = Math.floor(i / l);
    } while (i !== 0);
    return s;
}

document.write(hash('0') + '<br>');          // => 0
document.write(hash('a') + '<br>');          // => 1
document.write(hash('hi') + '<br>');         // => 225
document.write(hash('world') + '<br>');      // => 12531838
document.write(hash('freecode') + '<br>');   // => 69810159857

document.write(ihash(0) + '<br>');           // => '0'
document.write(ihash(1) + '<br>');           // => 'a'
document.write(ihash(225) + '<br>');         // => 'hi'
document.write(ihash(12531838) + '<br>');    // => 'world'
document.write(ihash(69810159857) + '<br>'); // => 'freecode'
&#13;
&#13;
&#13;

答案 1 :(得分:0)

这是一个用于获取字符串的伪代码。它类似于转换不同基数的数字。

   var txt = function(n, charset) {
        var s =""
        while (n > 0) {
            var r = n % charset.length;
            n = n / charset.length;
            s += charset[r];
         }
         return s;
     }