@gattamaneni/js-big-decimal
Version:
Work with large numbers on the client side. Round them off to any required precission.
2 lines (1 loc) • 8.89 kB
JavaScript
(function(A,w){typeof exports=="object"&&typeof module<"u"?w(exports):typeof define=="function"&&define.amd?define(["exports"],w):(A=typeof globalThis<"u"?globalThis:A||self,w(A.BigDecimal={}))})(this,function(A){"use strict";function w(t,e="0"){let l=0,a=-1;t[0]=="-"&&(t=t.substring(1),S(t)||(l++,a=1,t.length)),e[0]=="-"&&(e=e.substring(1),S(e)||(l++,a=2,e.length)),t=o(t),e=o(e),[t,e]=L(o(t),o(e)),l==1&&(a===1?t=x(t):a===2&&(e=x(e)));let s=P(t,e);return l?l==2?"-"+o(s):t.length<s.length?o(s.substring(1)):"-"+o(x(s)):o(s)}function x(t){if(S(t))return t;let e="",l=t.length,a=t.split(".")[1],s=a?a.length:0;for(let i=0;i<l;i++)t[i]>="0"&&t[i]<="9"?e+=9-parseInt(t[i]):e+=t[i];let f=s>0?"0."+new Array(s).join("0")+"1":"1";return P(e,f)}function o(t){let e=t.split(".");for(e[0]||(e[0]="0");e[0][0]=="0"&&e[0].length>1;)e[0]=e[0].substring(1);return e[0]+(e[1]?"."+e[1]:"")}function L(t,e){let l=t.split("."),a=e.split("."),s=l[0].length,f=a[0].length;return s>f?a[0]=new Array(Math.abs(s-f)+1).join("0")+(a[0]?a[0]:""):l[0]=new Array(Math.abs(s-f)+1).join("0")+(l[0]?l[0]:""),s=l[1]?l[1].length:0,f=a[1]?a[1].length:0,(s||f)&&(s>f?a[1]=(a[1]?a[1]:"")+new Array(Math.abs(s-f)+1).join("0"):l[1]=(l[1]?l[1]:"")+new Array(Math.abs(s-f)+1).join("0")),t=l[0]+(l[1]?"."+l[1]:""),e=a[0]+(a[1]?"."+a[1]:""),[t,e]}function P(t,e){[t,e]=L(t,e);let l="",a=0;for(let s=t.length-1;s>=0;s--){if(t[s]==="."){l="."+l;continue}let f=parseInt(t[s])+parseInt(e[s])+a;l=f%10+l,a=Math.floor(f/10)}return a?a.toString()+l:l}function S(t){return/^0[0]*[.]{0,1}[0]*$/.test(t)}function D(t){return(typeof t=="number"||typeof t=="bigint")&&(t=t.toString()),t[0]=="-"?t.substring(1):t}var h=(t=>(t[t.CEILING=0]="CEILING",t[t.DOWN=1]="DOWN",t[t.FLOOR=2]="FLOOR",t[t.HALF_DOWN=3]="HALF_DOWN",t[t.HALF_EVEN=4]="HALF_EVEN",t[t.HALF_UP=5]="HALF_UP",t[t.UNNECESSARY=6]="UNNECESSARY",t[t.UP=7]="UP",t))(h||{});function E(t,e=0,l=h.HALF_EVEN){if(l===h.UNNECESSARY)throw new Error("UNNECESSARY Rounding Mode has not yet been implemented");(typeof t=="number"||typeof t=="bigint")&&(t=t.toString());let a=!1;t[0]==="-"&&(a=!0,t=t.substring(1));let s=t.split("."),f=s[0],i=s[1];if(e<0){if(e=-e,f.length<=e)return"0";{let g=f.substr(0,f.length-e);return t=g+"."+f.substr(f.length-e)+i,g=E(t,0,l),(a?"-":"")+g+new Array(e+1).join("0")}}if(e==0)return f.length,H(s[1],f,a,l)&&(f=j(f)),(a&&parseInt(f)?"-":"")+f;if(s[1]){if(s[1].length<e)return(a?"-":"")+f+"."+s[1]+new Array(e-s[1].length+1).join("0")}else return(a?"-":"")+f+"."+new Array(e+1).join("0");i=s[1].substring(0,e);let c=s[1].substring(e);return c&&H(c,i,a,l)&&(i=j(i),i.length>e)?(a?"-":"")+j(f,parseInt(i[0]))+"."+i.substring(1):(a&&(parseInt(f)||parseInt(i))?"-":"")+f+"."+i}function H(t,e,l,a){if(!t||t===new Array(t.length+1).join("0")||a===h.DOWN||!l&&a===h.FLOOR||l&&a===h.CEILING)return!1;if(a===h.UP||l&&a===h.FLOOR||!l&&a===h.CEILING)return!0;let s="5"+new Array(t.length).join("0");if(t>s)return!0;if(t<s)return!1;switch(a){case h.HALF_DOWN:return!1;case h.HALF_UP:return!0;case h.HALF_EVEN:default:return parseInt(e[e.length-1])%2==1}}function j(t,e=0){e||(e=1),typeof t=="number"&&t.toString();let l=t.length-1,a="";for(let s=l;s>=0;s--){let f=parseInt(t[s])+e;f==10?(e=1,f=0):e=0,a+=f}return e&&(a+=e),a.split("").reverse().join("")}function F(t,e){t=t.toString(),e=e.toString();let l=0;t[0]=="-"&&(l++,t=t.substr(1)),e[0]=="-"&&(l++,e=e.substr(1)),t=N(t),e=N(e);let a=0,s=0;t.indexOf(".")!=-1&&(a=t.length-t.indexOf(".")-1),e.indexOf(".")!=-1&&(s=e.length-e.indexOf(".")-1);let f=a+s;if(t=N(t.replace(".","")),e=N(e.replace(".","")),t.length<e.length){let O=t;t=e,e=O}if(e=="0")return"0";let i=e.length,c=0,g=[],n=i-1,p="";for(let O=0;O<i;O++)g[O]=t.length-1;for(let O=0;O<2*t.length;O++){let I=0;for(let y=e.length-1;y>=n&&y>=0;y--)g[y]>-1&&g[y]<t.length&&(I+=parseInt(t[g[y]--])*parseInt(e[y]));I+=c,c=Math.floor(I/10),p=I%10+p,n--}return p=N(G(p,f)),l==1&&(p="-"+p),p}function G(t,e){return e==0?t:(t=e>=t.length?new Array(e-t.length+1).join("0")+t:t,t.substr(0,t.length-e)+"."+t.substr(t.length-e,e))}function N(t){for(;t[0]=="0";)t=t.substr(1);if(t.indexOf(".")!=-1)for(;t[t.length-1]=="0";)t=t.substr(0,t.length-1);return t==""||t=="."?t="0":t[t.length-1]=="."&&(t=t.substr(0,t.length-1)),t[0]=="."&&(t="0"+t),t}function V(t,e,l=8){if(e==0)throw new Error("Cannot divide by 0");if(t=t.toString(),e=e.toString(),t=t.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,""),e=e.replace(/(\.\d*?[1-9])0+$/g,"$1").replace(/\.0+$/,""),t==0)return"0";let a=0;e[0]=="-"&&(e=e.substring(1),a++),t[0]=="-"&&(t=t.substring(1),a++);var s=e.indexOf(".")>0?e.length-e.indexOf(".")-1:-1;if(e=o(e.replace(".","")),s>=0){let n=t.indexOf(".")>0?t.length-t.indexOf(".")-1:-1;if(n==-1)t=o(t+new Array(s+1).join("0"));else if(s>n)t=t.replace(".",""),t=o(t+new Array(s-n+1).join("0"));else if(s<n){t=t.replace(".","");let p=t.length-n+s;t=o(t.substring(0,p)+"."+t.substring(p))}else s==n&&(t=o(t.replace(".","")))}let f=0,i=e.length,c="",g=t.indexOf(".")>-1&&t.indexOf(".")<i?t.substring(0,i+1):t.substring(0,i);if(t=t.indexOf(".")>-1&&t.indexOf(".")<i?t.substring(i+1):t.substring(i),g.indexOf(".")>-1){let n=g.length-g.indexOf(".")-1;g=g.replace(".",""),i>g.length&&(n+=i-g.length,g=g+new Array(i-g.length+1).join("0")),f=n,c="0."+new Array(n).join("0")}for(l=l+2;f<=l;){let n=0;for(;parseInt(g)>=parseInt(e);)g=w(g,"-"+e),n++;c+=n,t?(t[0]=="."&&(c+=".",f++,t=t.substring(1)),g=g+t.substring(0,1),t=t.substring(1)):(f||(c+="."),f++,g=g+"0")}return(a==1?"-":"")+o(E(c,l-2))}function _(t,e){return t=t.toString(),e=e.toString(),e=C(e),w(t,e)}function C(t){return t[0]=="-"?t=t.substr(1):t="-"+t,t}function U(t,e){if(e==0)throw new Error("Cannot divide by 0");t=t.toString(),e=e.toString(),W(t),W(e);let l="";t[0]=="-"&&(l="-",t=t.substr(1)),e[0]=="-"&&(e=e.substr(1));let a=_(t,F(e,E(V(t,e),0,h.FLOOR)));return l+a}function W(t){if(t.indexOf(".")!=-1)throw new Error("Modulus of non-integers not supported")}function T(t,e){let l=!1;if(t[0]=="-"&&e[0]!="-")return-1;if(t[0]!="-"&&e[0]=="-")return 1;if(t[0]=="-"&&e[0]=="-"&&(t=t.substr(1),e=e.substr(1),l=!0),[t,e]=L(t,e),t.localeCompare(e)==0)return 0;for(let a=0;a<t.length;a++)if(t[a]!=e[a])return t[a]>e[a]?l?-1:1:l?1:-1;return 0}const r=class{static validate(t){if(t){if(t=t.toString(),isNaN(t))throw Error("Parameter is not a number: "+t);t[0]=="+"&&(t=t.substring(1))}else t="0";if(t.startsWith(".")?t="0"+t:t.startsWith("-.")&&(t="-0"+t.substr(1)),/e/i.test(t)){let[e,l]=t.split(/[eE]/);e=o(e);let a="";e[0]=="-"&&(a="-",e=e.substring(1)),e.indexOf(".")>=0?(l=parseInt(l)+e.indexOf("."),e=e.replace(".","")):l=parseInt(l)+e.length,e.length<l?t=a+e+new Array(l-e.length+1).join("0"):e.length>=l&&l>0?t=a+o(e.substring(0,l))+(e.length>l?"."+e.substring(l):""):t=a+"0."+new Array(-l+1).join("0")+e}return t}constructor(t="0"){this.value=r.validate(t)}getValue(){return this.value}setValue(t){this.value=r.validate(t)}static getPrettyValue(t,e,l){if(!(e||l))e=3,l=",";else if(!(e&&l))throw Error("Illegal Arguments. Should pass both digits and separator or pass none");t=r.validate(t);let a=t.charAt(0)=="-";a&&(t=t.substring(1));var s=t.indexOf(".");s=s>0?s:t.length;for(var f="",i=s;i>0;)i<e?(e=i,i=0):i-=e,f=t.substring(i,i+e)+(i<s-e&&i>=0?l:"")+f;return(a?"-":"")+f+t.substring(s)}getPrettyValue(t,e){return r.getPrettyValue(this.value,t,e)}static round(t,e=0,l=h.HALF_EVEN){if(t=r.validate(t),isNaN(e))throw Error("Precision is not a number: "+e);return E(t,e,l)}round(t=0,e=h.HALF_EVEN){if(isNaN(t))throw Error("Precision is not a number: "+t);return new r(E(this.value,t,e))}static abs(t){return t=r.validate(t),D(t)}abs(){return new r(D(this.value))}static floor(t){return t=r.validate(t),t.indexOf(".")===-1?t:r.round(t,0,h.FLOOR)}floor(){return this.value.indexOf(".")===-1?new r(this.value):new r(this.value).round(0,h.FLOOR)}static ceil(t){return t=r.validate(t),t.indexOf(".")===-1?t:r.round(t,0,h.CEILING)}ceil(){return this.value.indexOf(".")===-1?new r(this.value):new r(this.value).round(0,h.CEILING)}static add(t,e){return t=r.validate(t),e=r.validate(e),w(t,e)}add(t){return new r(w(this.value,t.getValue()))}static subtract(t,e){return t=r.validate(t),e=r.validate(e),_(t,e)}subtract(t){return new r(_(this.value,t.getValue()))}static multiply(t,e){return t=r.validate(t),e=r.validate(e),F(t,e)}multiply(t){return new r(F(this.value,t.getValue()))}static divide(t,e,l){return t=r.validate(t),e=r.validate(e),V(t,e,l)}divide(t,e){return new r(V(this.value,t.getValue(),e))}static modulus(t,e){return t=r.validate(t),e=r.validate(e),U(t,e)}modulus(t){return new r(U(this.value,t.getValue()))}static compareTo(t,e){return t=r.validate(t),e=r.validate(e),T(t,e)}compareTo(t){return T(this.value,t.getValue())}static negate(t){return t=r.validate(t),C(t)}negate(){return new r(C(this.value))}};let $=r;$.RoundingModes=h,A.bigDecimal=$,Object.defineProperty(A,Symbol.toStringTag,{value:"Module"})});