日期:2014-05-16 浏览次数:20526 次
<script type="text/javascript">
<!--
var nstr = "";
function dN(num,len){
num.toString().replace(/-|0(?=\.)|\./g,function(){return arguments[3];}).replace(/\d/g, function(){
(nstr.indexOf(arguments[0]) == -1) && (nstr += arguments[0])
})
return nstr.substring(0,len)
}
alert(dN(-0.233641464278, 5))
//-->
</script>
------解决方案--------------------
再优化了一下, 不知道用哈希效率怎么样, 期待高手出现.
function dN(num, len){
var d = 0;
return num.toString().replace(/-?0?\.0*/, "").replace(/\d/g, function(v, i, s){
return i-d >= len ? '' : (s.indexOf(v) < i ? (d++,'') : v);
});
}
alert(dN(-0.303333351211745764444444444444444,5));
------解决方案--------------------
试试看:
<script type="text/javascript">
var dN = function(num,len){
var s = num.toString().replace(/(?:^[^\d]*0*|[^\d])*/g,'').split('').reverse().join('').replace(/(\d)(?=.*\1)/g,'').split('').reverse();
s.length =len;
return s.slice(0).join('');
};
alert(dN(-0.233641464278,4));
alert(dN(-0.303545,3));
alert(dN(33766545,4));
</script>
------解决方案--------------------
正则效率并不会比直接循环更快,只是开发效率快而已。正则自身也是需要循环来判断的。
试试这个:
function dN(num, len){
num = num.toString().replace(/^0+|\D+/g, "");
var dict = {};
var result = 0;
for (var i = 0; len > 0 && i < num.length; i++) {
var c = num.charAt(i);
if (!dict[c]) {
result *= 10;
result += parseInt(c);
len--;
dict[c] = true;
}
}
return result.toString();
}
alert(dN("0.123153422", 6));