UNPKG

react-currency-input-field

Version:

React <input/> component for formatting currency and numbers.

3 lines (2 loc) 7.43 kB
import me,{useState as j,useEffect as ge,useRef as Te,forwardRef as Le,useMemo as ke,useImperativeHandle as ve}from"react";var m=r=>r.replace(/[-/\\^$*+?.()|[\]{}]/g,"\\$&");var Se={k:1e3,m:1e6,b:1e9},ce=(r,t=".")=>{let e=new RegExp(`(\\d+(${m(t)}\\d*)?)([kmb])$`,"i"),s=r.match(e);if(s){let[,i,,o]=s,n=Se[o.toLowerCase()];return Number(i.replace(t,"."))*n}};var pe=(r,t=",")=>{let e=new RegExp(m(t),"g");return r.replace(e,"")};var fe=(r,t)=>{let e=m(t.join("")),s=new RegExp(`[^\\d${e}]`,"gi");return r.replace(s,"")};var L=({value:r,groupSeparator:t=",",decimalSeparator:e=".",allowDecimals:s=!0,decimalsLimit:i=2,allowNegativeValue:o=!0,disableAbbreviations:n=!1,prefix:u="",transformRawValue:p=g=>g})=>{let g=p(r);if(g==="-")return g;let b=n?[]:["k","m","b"],I=new RegExp(`((^|\\D)-\\d)|(-${m(u)})`).test(g),[k,E]=RegExp(`(\\d+)-?${m(u)}`).exec(r)||[],l=u?k?g.replace(k,"").concat(E):g.replace(u,""):g,V=pe(l,t),d=fe(V,[t,e,...b]),y=d;if(!n){if(b.some(O=>O===d.toLowerCase().replace(e,"")))return"";let P=ce(d,e);P&&(y=String(P))}let v=I&&o?"-":"";if(e&&y.includes(e)){let[P,O]=d.split(e),z=i&&O?O.slice(0,i):O,A=s?`${e}${z}`:"";return`${v}${P}${A}`}return`${v}${y}`};var Z=(r,t,e)=>{if(e!==void 0&&r.length>1){if(e===0)return r.replace(t,"");if(r.includes(t)){let[o,n]=r.split(t);if(n.length===e)return r;if(n.length>e)return`${o}${t}${n.slice(0,e)}`}let s=r.length>e?new RegExp(`(\\d+)(\\d{${e}})`):new RegExp("(\\d)(\\d+)"),i=r.match(s);if(i){let[,o,n]=i;return`${o}${t}${n}`}}return r};var W=(r,{groupSeparator:t=",",decimalSeparator:e="."})=>{let s=new RegExp(`\\d([^${m(t)}${m(e)}0-9]+)`),i=r.match(s);return i?i[1]:void 0};var S=r=>{let{value:t,decimalSeparator:e,intlConfig:s,decimalScale:i,prefix:o="",suffix:n=""}=r;if(t===""||t===void 0)return"";if(t==="-")return"-";let u=new RegExp(`^\\d?-${o?`${m(o)}?`:""}\\d`).test(t),p=e!=="."?Pe(t,e,u):t;e&&e!=="-"&&p.startsWith(e)&&(p="0"+p);let{locale:g,currency:b,...w}=s||{},I={...w,minimumFractionDigits:i||0,maximumFractionDigits:20},E=(s?new Intl.NumberFormat(g,{...I,...b&&{style:"currency",currency:b}}):new Intl.NumberFormat(void 0,I)).formatToParts(Number(p)),l=Ne(E,r),V=W(l,{...r}),d=t.slice(-1)===e?e:"",[,y]=p.match(RegExp("\\d+\\.(\\d+)"))||[];return i===void 0&&y&&e&&(l.includes(e)?l=l.replace(RegExp(`(\\d+)(${m(e)})(\\d+)`,"g"),`$1$2${y}`):V&&!n?l=l.replace(V,`${e}${y}${V}`):l=`${l}${e}${y}`),n&&d?`${l}${d}${n}`:V&&d?l.replace(V,`${d}${V}`):V&&n?l.replace(V,`${d}${n}`):[l,d,n].join("")},Pe=(r,t,e)=>{let s=r;return t&&t!=="."&&(s=s.replace(RegExp(m(t),"g"),"."),e&&t==="-"&&(s=`-${s.slice(1)}`)),s},Ne=(r,{prefix:t,groupSeparator:e,decimalSeparator:s,decimalScale:i,disableGroupSeparators:o=!1})=>r.reduce((n,{type:u,value:p},g)=>g===0&&t?u==="minusSign"?[p,t]:u==="currency"?[...n,t]:[t,p]:u==="currency"?t?n:[...n,p]:u==="group"?o?n:[...n,e!==void 0?e:p]:u==="decimal"?i!==void 0&&i===0?n:[...n,s!==void 0?s:p]:u==="fraction"?[...n,i!==void 0?p.slice(0,i):p]:[...n,p],[""]).join("");var Me={currencySymbol:"",groupSeparator:"",decimalSeparator:"",prefix:"",suffix:""},_=r=>{let{locale:t,currency:e,...s}=r||{};return(t?new Intl.NumberFormat(t,{...s,...e&&{currency:e,style:"currency"}}):new Intl.NumberFormat).formatToParts(1000.1).reduce((o,n,u)=>n.type==="currency"?u===0?{...o,currencySymbol:n.value,prefix:n.value}:{...o,currencySymbol:n.value,suffix:n.value}:n.type==="group"?{...o,groupSeparator:n.value}:n.type==="decimal"?{...o,decimalSeparator:n.value}:o,Me)};var q=r=>RegExp(/\d/,"gi").test(r);var ee=(r,t,e)=>{if(e===void 0||t===""||t===void 0||r===""||r===void 0)return r;if(!r.match(/\d/g))return"";let[s,i]=r.split(t);if(e===0)return s;let o=i||"";if(o.length<e)for(;o.length<e;)o+="0";else o=o.slice(0,e);return`${s}${t}${o}`};var te=({selectionStart:r,value:t,lastKeyStroke:e,stateValue:s,groupSeparator:i})=>{let o=r,n=t;if(s&&o){let u=t.split("");return e==="Backspace"&&s[o]===i&&(u.splice(o-1,1),o-=1),e==="Delete"&&s[o]===i&&(u.splice(o,1),o+=1),n=u.join(""),{modifiedValue:n,cursorPosition:o}}return{modifiedValue:n,cursorPosition:r}};var re=Le(({allowDecimals:r=!0,allowNegativeValue:t=!0,id:e,name:s,className:i,customInput:o,decimalsLimit:n,defaultValue:u,disabled:p=!1,maxLength:g,value:b,onValueChange:w,fixedDecimalLength:I,placeholder:k,decimalScale:E,prefix:l,suffix:V,intlConfig:d,step:y,min:v,max:P,disableGroupSeparators:O=!1,disableAbbreviations:z=!1,decimalSeparator:A,groupSeparator:B,onChange:ne,onFocus:oe,onBlur:U,onKeyDown:se,onKeyUp:ie,transformRawValue:xe,formatValueOnBlur:be=!0,...ye},Ce)=>{if(A&&q(A))throw new Error("decimalSeparator cannot be a number");if(B&&q(B))throw new Error("groupSeparator cannot be a number");let G=ke(()=>_(d),[d]),f=A||G.decimalSeparator||"",N=B||G.groupSeparator||"";if(f&&N&&f===N&&O===!1)throw new Error("decimalSeparator cannot be the same as groupSeparator");let D={decimalSeparator:f,groupSeparator:N,disableGroupSeparators:O,intlConfig:d,prefix:l||G.prefix,suffix:V},J={decimalSeparator:f,groupSeparator:N,allowDecimals:r,decimalsLimit:n||I||2,allowNegativeValue:t,disableAbbreviations:z,prefix:l||G.prefix,transformRawValue:xe},[C,H]=j(()=>u!=null?S({...D,decimalScale:E,value:String(u)}):b!=null?S({...D,decimalScale:E,value:String(b)}):""),[Q,he]=j(!1),[X,Y]=j(0),[ue,Ve]=j(0),[$e,we]=j(null),F=Te(null);ve(Ce,()=>F.current);let ae=(c,h)=>{he(!0);let{modifiedValue:x,cursorPosition:$}=te({selectionStart:h,value:c,lastKeyStroke:$e,stateValue:C,groupSeparator:N}),a=L({value:x,...J});if(g&&a.replace(/-/g,"").length>g)return;if(a===""||a==="-"||a===f){w&&w(void 0,s,{float:null,formatted:"",value:""}),H(a),Y(1);return}let R=f?a.replace(f,"."):a,M=parseFloat(R),T=S({value:a,...D});if($!=null){let K=$+(T.length-c.length);K=K<=0?l?l.length:0:K,Y(K),Ve(ue+1)}H(T),w&&w(a,s,{float:M,formatted:T,value:a})},Ee=c=>{let{target:{value:h,selectionStart:x}}=c;ae(h,x),ne&&ne(c)},Re=c=>(oe&&oe(c),C?C.length:0),Ie=c=>{let{target:{value:h}}=c,x=L({value:h,...J});if(x==="-"||x===f||!x){H(""),U&&U(c);return}let $=Z(x,f,I),a=ee($,f,E!==void 0?E:I),R=f?a.replace(f,"."):a,M=parseFloat(R),T=S({...D,value:a});w&&be&&w(a,s,{float:M,formatted:T,value:a}),H(T),U&&U(c)},Oe=c=>{let{key:h}=c;if(we(h),y&&(h==="ArrowUp"||h==="ArrowDown")){c.preventDefault(),Y(C.length);let x=b!=null?String(b):void 0,$=f&&x?x.replace(f,"."):x,a=parseFloat($??L({value:C,...J}))||0,R=h==="ArrowUp"?a+y:a-y;if(v!==void 0&&R<Number(v)||!t&&R<0||P!==void 0&&R>Number(P))return;let M=String(y).includes(".")?Number(String(y).split(".")[1].length):void 0;ae(String(M?R.toFixed(M):R).replace(".",f))}se&&se(c)},Fe=c=>{let{key:h,currentTarget:{selectionStart:x}}=c;if(h!=="ArrowUp"&&h!=="ArrowDown"&&C!=="-"){let $=W(C,{groupSeparator:N,decimalSeparator:f});if($&&x&&x>C.length-$.length&&F.current){let a=C.length-$.length;F.current.setSelectionRange(a,a)}}ie&&ie(c)};ge(()=>{b==null&&u==null&&H("")},[u,b]),ge(()=>{Q&&C!=="-"&&F.current&&document.activeElement===F.current&&F.current.setSelectionRange(X,X)},[C,X,F,Q,ue]);let le={type:"text",inputMode:"decimal",id:e,name:s,className:i,onChange:Ee,onBlur:Ie,onFocus:Re,onKeyDown:Oe,onKeyUp:Fe,placeholder:k,disabled:p,value:b!=null&&C!=="-"&&(!f||C!==f)?S({...D,decimalScale:Q?void 0:E,value:String(b)}):C,ref:F,...ye};return o?me.createElement(o,{...le}):me.createElement("input",{...le})});re.displayName="CurrencyInput";var de=re;var $t=de;export{re as CurrencyInput,L as cleanValue,$t as default,S as formatValue}; //# sourceMappingURL=index.js.map