CalcEval.js 7.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302
  1. Number.prototype.toFixed = function(j) {
  2. var h = this + "";
  3. if (!j) {
  4. j = 0
  5. }
  6. if (h.indexOf(".") == -1) {
  7. h += "."
  8. }
  9. h += new Array(j + 1).join("0");
  10. if (new RegExp("^(-|\\+)?(\\d+(\\.\\d{0," + (j + 1) + "})?)\\d*$").test(h)) {
  11. var h = "0" + RegExp.$2
  12. , g = RegExp.$1
  13. , e = RegExp.$3.length
  14. , c = true;
  15. if (e == j + 2) {
  16. e = h.match(/\d/g);
  17. if (parseInt(e[e.length - 1]) > 4) {
  18. for (var f = e.length - 2; f >= 0; f--) {
  19. e[f] = parseInt(e[f]) + 1;
  20. if (e[f] == 10) {
  21. e[f] = 0;
  22. c = f != 1
  23. } else {
  24. break
  25. }
  26. }
  27. }
  28. h = e.join("").replace(new RegExp("(\\d+)(\\d{" + j + "})\\d$"), "$1.$2")
  29. }
  30. if (c) {
  31. h = h.substr(1)
  32. }
  33. return (g + h).replace(/\.$/, "")
  34. }
  35. return this + ""
  36. }
  37. ;
  38. var CalcEvalMin = function() {};
  39. CalcEvalMin.prototype.eval = function(str) {
  40. var isRetStr = str.match(new RegExp(/^".+"$/g)) != null;
  41. if (isRetStr == true) {
  42. str = str.replace(/^"|"$/g, "")
  43. }
  44. var bracketsList = this.matchOutBrackets(str);
  45. for (var i = 0; i < bracketsList.length; i++) {
  46. var newCalc = bracketsList[i];
  47. var calcStr = this.eval(newCalc.str.replace(/^\(|\)$/g, ""));
  48. str = str.replace(newCalc.str, calcStr)
  49. }
  50. var errorObj = new Array();
  51. while (1) {
  52. var multObj = this.matchExp(str, "/");
  53. if (multObj == null) {
  54. break
  55. }
  56. var v = this.executeDivi(multObj.firstValue, multObj.secondValue);
  57. if (v == "NaN") {
  58. var t = "T" + new Date().getTime();
  59. errorObj.push({
  60. Name: t,
  61. Exp: multObj.str
  62. });
  63. str = str.replace(multObj.str, t)
  64. } else {
  65. str = str.replace(multObj.str, v)
  66. }
  67. }
  68. while (1) {
  69. var multObj = this.matchExp(str, "*");
  70. if (multObj == null) {
  71. break
  72. }
  73. var v = this.executeMult(multObj.firstValue, multObj.secondValue);
  74. if (v == "NaN") {
  75. var t = "T" + new Date().getTime();
  76. errorObj.push({
  77. Name: t,
  78. Exp: multObj.str
  79. });
  80. str = str.replace(multObj.str, t)
  81. } else {
  82. str = str.replace(multObj.str, v)
  83. }
  84. }
  85. while (1) {
  86. var multObj = this.matchExp(str, "+");
  87. if (multObj == null) {
  88. break
  89. }
  90. var v = this.executeAddi(multObj.firstValue, multObj.secondValue);
  91. if (v == "NaN" || isNaN(v)) {
  92. var t = "T" + new Date().getTime();
  93. errorObj.push({
  94. Name: t,
  95. Exp: multObj.str
  96. });
  97. str = str.replace(multObj.str, t)
  98. } else {
  99. str = str.replace(multObj.str, v)
  100. }
  101. }
  102. while (1) {
  103. var multObj = this.matchExp(str, "-");
  104. if (multObj == null) {
  105. break
  106. }
  107. var v = this.executeSubt(multObj.firstValue, multObj.secondValue);
  108. if (v == "NaN") {
  109. var t = "T" + new Date().getTime();
  110. errorObj.push({
  111. Name: t,
  112. Exp: multObj.str
  113. });
  114. str = str.replace(multObj.str, t)
  115. } else {
  116. str = str.replace(multObj.str, v)
  117. }
  118. }
  119. for (var i = errorObj.length - 1; i >= 0; i--) {
  120. var ex = errorObj[i];
  121. str = str.replace(ex.Name, ex.Exp)
  122. }
  123. while (1) {
  124. var multObj = str.match(/\d*={2,3}\d*/g);
  125. if (multObj == null) {
  126. break
  127. }
  128. var v = eval(multObj[0]);
  129. str = str.replace(multObj[0], v)
  130. }
  131. if (isRetStr == true) {
  132. try {
  133. return eval('"' + str + '"')
  134. } catch (e) {}
  135. try {
  136. return eval(str)
  137. } catch (e) {}
  138. return str
  139. }
  140. if (str.match(/(^true$)|(^false$)/g)) {
  141. return str === "true"
  142. }
  143. if (!isNaN(Number(str))) {
  144. return Number(str)
  145. }
  146. try {
  147. return eval(str)
  148. } catch (e) {}
  149. return str
  150. }
  151. ;
  152. CalcEvalMin.prototype.matchOutBrackets = function(f) {
  153. var h = new Array();
  154. if (f == null) {
  155. return h
  156. }
  157. if (typeof f != "string") {
  158. f = f + ""
  159. }
  160. var d = f.split("");
  161. var a = 0;
  162. var g = false;
  163. var b = -1;
  164. for (var c = 0; c < d.length; c++) {
  165. if (d[c] == "(") {
  166. a++;
  167. g = true;
  168. if (b == -1) {
  169. b = c
  170. }
  171. }
  172. if (d[c] == ")") {
  173. a--
  174. }
  175. if (g == true && a == 0) {
  176. var e = new Object();
  177. e.str = f.substring(b, c + 1);
  178. e.firstIndex = b;
  179. e.lastIndex = c + 1;
  180. h.push(e);
  181. b = -1;
  182. g = false;
  183. a = 0
  184. }
  185. }
  186. return h
  187. }
  188. ;
  189. CalcEvalMin.prototype.matchExp = function(l, f) {
  190. var j = null;
  191. if (l == null) {
  192. return retList
  193. }
  194. if (typeof l != "string") {
  195. l = l + ""
  196. }
  197. var k = l.split("");
  198. var c = 0;
  199. var b = 0;
  200. var g = "";
  201. var e = "";
  202. var a = "";
  203. var d = false;
  204. for (var h = 0; h <= k.length; h++) {
  205. if (k[h] == "+" || k[h] == "-" || k[h] == "*" || k[h] == "/" || k[h] == "%" || h == k.length) {
  206. if (a == "" && k[h] == "-") {
  207. a += k[h];
  208. continue
  209. }
  210. if (d == true) {
  211. e = a;
  212. b = h;
  213. j = new Object();
  214. j.firstIndex = c;
  215. j.secondIndex = b;
  216. j.str = l.substring(c, b);
  217. j.firstValue = Number(g);
  218. j.secondValue = Number(e);
  219. break
  220. }
  221. if (k[h] == null) {
  222. break
  223. }
  224. if (k[h] == f) {
  225. d = true;
  226. g = a;
  227. a = ""
  228. } else {
  229. a = "";
  230. c = -1
  231. }
  232. } else {
  233. a += k[h];
  234. if (c == -1) {
  235. c = h
  236. }
  237. }
  238. }
  239. return j
  240. }
  241. ;
  242. CalcEvalMin.prototype.executeMult = function(d, b) {
  243. var a = 0
  244. , f = d.toString()
  245. , c = b.toString();
  246. try {
  247. a += f.split(".")[1].length
  248. } catch (g) {}
  249. try {
  250. a += c.split(".")[1].length
  251. } catch (g) {}
  252. return Number(f.replace(".", "")) * Number(c.replace(".", "")) / Math.pow(10, a)
  253. }
  254. ;
  255. CalcEvalMin.prototype.executeDivi = function(arg1, arg2) {
  256. var t1 = 0, t2 = 0, r1, r2;
  257. try {
  258. t1 = arg1.toString().split(".")[1].length
  259. } catch (e) {}
  260. try {
  261. t2 = arg2.toString().split(".")[1].length
  262. } catch (e) {}
  263. with (Math) {
  264. r1 = Number(arg1.toString().replace(".", ""));
  265. r2 = Number(arg2.toString().replace(".", ""));
  266. return this.executeMult(r1 / r2, pow(10, t2 - t1))
  267. }
  268. }
  269. ;
  270. CalcEvalMin.prototype.executeAddi = function(arg1, arg2) {
  271. var r1, r2, m;
  272. try {
  273. r1 = arg1.toString().split(".")[1].length
  274. } catch (e) {
  275. r1 = 0
  276. }
  277. try {
  278. r2 = arg2.toString().split(".")[1].length
  279. } catch (e) {
  280. r2 = 0
  281. }
  282. m = Math.pow(10, Math.max(r1, r2));
  283. return (this.eval(arg1 + "*" + m) + this.eval(arg2 + "*" + m)) / m
  284. }
  285. ;
  286. CalcEvalMin.prototype.executeSubt = function(arg1, arg2) {
  287. var r1, r2, m, n;
  288. try {
  289. r1 = arg1.toString().split(".")[1].length
  290. } catch (e) {
  291. r1 = 0
  292. }
  293. try {
  294. r2 = arg2.toString().split(".")[1].length
  295. } catch (e) {
  296. r2 = 0
  297. }
  298. m = Math.pow(10, Math.max(r1, r2));
  299. n = (r1 >= r2) ? r1 : r2;
  300. return ((this.eval(arg1 + "*" + m) - this.eval(arg2 + "*" + m)) / m).toFixed(n)
  301. }
  302. ;