j'espère qu'avec ça, j'aurai droit à ma place dans les "sources js" ? :mrgreen:
voici une version un peu plus compacte (1.2ko)
et la version compressée (1ko) :Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26 function calc(expression,v,i){ function add(n1,n2){ var i,len1,len2,len = Math.max(len1=((i= n1.toString().split('.')[1])?i.length:0),len2=((i = n2.toString().split('.')[1])?i.length:0)),zero = '0'; for(i=1;i<len;i*=2) zero += zero; var result = (parseInt(n1.toString().replace('.',''),10)*Math.pow(10,len-len1)+parseInt(n2.toString().replace('.',''),10)*Math.pow(10,len-len2)).toString(); result = (Number(result)<0)?('-'+zero+result.substring(1,result.length)):(zero+result); return Number(result.substr(0,result.length-len)+'.'+result.substr(result.length-len,result.length)); } function multi(n1,n2){ var i,len = ((i = n1.toString().split('.')[1])?i.length:0) + ((i = n2.toString().split('.')[1])?i.length:0),zero = '0'; for(i=1;i<=len;i*=2) zero += zero; var result = (parseInt(n1.toString().replace('.',''),10)*parseInt(n2.toString().replace('.',''),10)).toString(); result = Number(result)<0?'-'+zero+result.substring(1,result.length):zero+result; return Number(result.substr(0,result.length-len)+'.'+result.substr(result.length-len,result.length)); } while(expression != (expression = expression.replace(/\([^\(\)]*\)/,function(a){ var r=calc(a.slice(1,a.length-1));return r;}))); if((v = expression.split('+')).length>1 && !(expression = 0)){ for(i=0;i<v.length;i++) expression = add(expression,calc(v[i])); } if((v = expression.toString().split('*')).length>1 && (expression = 1)){ for(i=0;i<v.length;i++) expression = multi(expression,calc(v[i])); } return eval(expression); }
et la version "packed" (0.9 ko):Code:function calc(b,v,i){function y(a,b){var d,i,e,f,g=Math.max(e=((i=a.toString().split('.')[1])?i.length:0),f=((i=b.toString().split('.')[1])?i.length:0)),z="0";for(i=1;i<g;i*=2)z+=z;d=(parseInt(a.toString().replace('.',''),10)*Math.pow(10,g-e)+parseInt(b.toString().replace('.',''),10)*Math.pow(10,g-f)).toString();d=(Number(d)<0)?('-'+z+d.substring(1,d.length)):(z+d);return Number(d.substr(0,d.length-g)+'.'+d.substr(d.length-g,d.length))}function x(a,b){var d,i,g=((i=a.toString().split('.')[1])?i.length:0)+((i=b.toString().split('.')[1])?i.length:0),z="0";for(i=1;i<=g;i*=2)z+=z;d=(parseInt(a.toString().replace('.',''),10)*parseInt(b.toString().replace('.',''),10)).toString();d=Number(d)<0?'-'+z+d.substring(1,d.length):z+d;return Number(d.substr(0,d.length-g)+'.'+d.substr(d.length-g,d.length))}while(b!=(b=b.replace(/\([^\(\)]*\)/,function(a){return calc(a.slice(1,a.length-1))})));if((v=b.split('+')).length>1&&!(b=0))for(i=0;i<v.length;i++)b=y(b,calc(v[i]));if((v=b.toString().split('*')).length>1&&(b=1))for(i=0;i<v.length;i++)b=x(b,calc(v[i]));return eval(b)}
:PCode:eval(function(a,c){return a.replace(new RegExp('\\b\\d+\\b','g'),function(x){return c[x]||x})}("4 5(b,v,i){4 y(a,b){var d,i,e,f,g=6.max(e=((i=a.7().8('.')[1])?i.9:0),f=((i=b.7().8('.')[1])?i.9:0)),z='0';10(i=1;i<g;i*=2)z+=z;d=(11(a.7().12('.',''),3)*6.pow(3,g-e)+11(b.7().12('.',''),3)*6.pow(3,g-f)).7();d=(13(d)<0)?('-'+z+d.14(1,d.9)):(z+d);15 13(d.16(0,d.9-g)+'.'+d.16(d.9-g,d.9))}4 x(a,b){var d,i,g=((i=a.7().8('.')[1])?i.9:0)+((i=b.7().8('.')[1])?i.9:0),z='0';10(i=1;i<=g;i*=2)z+=z;d=(11(a.7().12('.',''),3)*11(b.7().12('.',''),3)).7();d=13(d)<0?'-'+z+d.14(1,d.9):z+d;15 13(d.16(0,d.9-g)+'.'+d.16(d.9-g,d.9))}while(b!=(b=b.12(/\\([^\\(\\)]*\\)/,4(a){15 5(a.slice(1,a.9-1))})));if((v=b.8('+')).9>1&&!(b=0))10(i=0;i<v.9;i++)b=y(b,5(v[i]));if((v=b.7().8('*')).9>1&&(b=1))10(i=0;i<v.9;i++)b=x(b,5(v[i]));15 eval(b)}",'0|1|2|10|function|calc|Math|toString|split|length|for|parseInt|replace|Number|substring|return|substr'.split('|')));
nb: ma version compressée possède 3 variables locales "b" et "v" et "i", évitez donc les appels du genre :
et préférez :Code:
1
2 var b=2, v=3; calc('b+v');
ou encoreCode:
1
2 var b=2, v=3; calc('self.b+self.v');
ou plus simplement évitez de nommer vos variables "b" et "v" et "i" lors des appels à la fonction calc. :mrgreen:Code:
1
2 var b=2, v=3; calc(b+'+'+v);
edit: nouvelle erreur des négatif corrigée !

