n2words
Version:
Convert numbers to words in 70+ languages with zero dependencies. Supports BigInt, decimals, and browser/Node.js environments.
3 lines (2 loc) • 8.77 kB
JavaScript
/*! n2words/lt-LT v5.1.2 | MIT License | github.com/forzagreen/n2words */
function t(t){let[e,i]=t.toLowerCase().split("e");const n=parseInt(i,10);let r="";"-"===e[0]&&(r="-",e=e.slice(1));const s=e.indexOf("."),o=-1===s?e:e.slice(0,s)+e.slice(s+1),a=(-1===s?e.length:s)+n;return a>=o.length?r+o+"0".repeat(a-o.length):a<=0?r+"0."+"0".repeat(-a)+o:r+o.slice(0,a)+"."+o.slice(a)}function e(e){const n=e.toString();return i(n)?t(n):n}function i(t){return t.includes("e")||t.includes("E")}function n(t){const e="-"===t[0];e&&(t=t.slice(1));const i=t.indexOf(".");if(-1===i)return{isNegative:e,integerPart:BigInt(t)};const n=t.slice(0,i)||"0",r=t.slice(i+1);return{isNegative:e,integerPart:BigInt(n),decimalPart:r}}function r(e){let n=e.trim();if(0===n.length||Number.isNaN(Number(n)))throw new RangeError(`Invalid currency format: "${e}"`);i(n)&&(n=t(n));const r="-"===n[0];r&&(n=n.slice(1));const s=n.indexOf(".");if(-1===s)return{isNegative:r,dollars:BigInt(n),cents:0n};const o=n.slice(0,s)||"0",a=(n.slice(s+1)+"00").slice(0,2);return{isNegative:r,dollars:BigInt(o),cents:BigInt(a)}}function s(t,e,i){if(null===e)return;if(t<e&&!(i&&BigInt(i)>=e))return;const n=e.toString().length-1,r=e===10n**BigInt(n)?`10^${n} - 1`:""+(e-1n);throw new RangeError(`Number too large to convert: the largest supported value is ${r}`)}function o(t){return 10n**BigInt(3*(t+1))}const a=["","vienas","du","trys","keturi","penki","šeši","septyni","aštuoni","devyni"],u=["","viena","dvi","trys","keturios","penkios","šešios","septynios","aštuonios","devynios"],l=["dešimt","vienuolika","dvylika","trylika","keturiolika","penkiolika","šešiolika","septyniolika","aštuoniolika","devyniolika"],c=["","","dvidešimt","trisdešimt","keturiasdešimt","penkiasdešimt","šešiasdešimt","septyniasdešimt","aštuoniasdešimt","devyniasdešimt"],f="šimtas",g="šimtai",m="nulis",d="minus",p=["","pirmas","antras","trečias","ketvirtas","penktas","šeštas","septintas","aštuntas","devintas"],h=["dešimtas","vienuoliktas","dvyliktas","tryliktas","keturioliktas","penkioliktas","šešioliktas","septynioliktas","aštuonioliktas","devynioliktas"],b=["","","dvidešimtas","trisdešimtas","keturiasdešimtas","penkiasdešimtas","šešiasdešimtas","septyniasdešimtas","aštuoniasdešimtas","devyniasdešimtas"],v=["","šimtasis","dviejų šimtasis","trijų šimtasis","keturių šimtasis","penkių šimtasis","šešių šimtasis","septynių šimtasis","aštuonių šimtasis","devynių šimtasis"],y=["tūkstantasis","milijonasis","milijardasis","trilijonasis"],w=["euras","eurai","eurų"],k=["centas","centai","centų"],N=[["tūkstantis","tūkstančiai","tūkstančių"],["milijonas","milijonai","milijonų"],["milijardas","milijardai","milijardų"],["trilijonas","trilijonai","trilijonų"],["kvadrilijonas","kvadrilijonai","kvadrilijonų"],["kvintilijonas","kvintilijonai","kvintilijonų"],["sikstilijonas","sikstilijonai","sikstilijonų"],["septilijonas","septilijonai","septilijonų"],["oktilijonas","oktilijonai","oktilijonų"]],j=o(N.length),I=o(y.length),E=o(N.length);function O(t){if(0===t)return"";const e=t%10,i=Math.trunc(t/10)%10,n=Math.trunc(t/100),r=[];return n>0&&(r.push(a[n]),r.push(1===n?f:g)),i>1&&r.push(c[i]),1===i?r.push(l[e]):e>0&&r.push(a[e]),r.join(" ")}function B(t,e){if(0===t)return e[2];const i=t%10,n=t%100;return n>=10&&n<=19||0===i?e[2]:1===i?e[0]:e[1]}function R(t,e){if(0n===t)return m;if(t<1000n){const i=Number(t);return"feminine"===e?function(t){if(0===t)return"";const e=t%10,i=Math.trunc(t/10)%10,n=Math.trunc(t/100),r=[];return n>0&&(r.push(a[n]),r.push(1===n?f:g)),i>1&&r.push(c[i]),1===i?r.push(l[e]):e>0&&r.push(u[e]),r.join(" ")}(i):O(i)}return function(t){const e=t.toString(),i=e.length,n=[],r=i%3;let s=0;for(r>0&&(n.push(Number(e.slice(0,r))),s=r);s<i;)n.push(Number(e.slice(s,s+3))),s+=3;const o=[];let a=n.length-1;for(let t=0;t<n.length;t++){const e=n[t];if(0!==e){const t=O(e);if(0===a)o.push(t);else{const i=B(e,N[a-1]);o.push(t+" "+i)}}a--}return o.join(" ")}(t)}const $={gender:"masculine"},P={gender:["masculine","feminine"]};function x(r,o){const{isNegative:a,integerPart:u,decimalPart:l}=function(r){const s=typeof r;if("bigint"==typeof r)return r<0n?{isNegative:!0,integerPart:-r}:{isNegative:!1,integerPart:r};if("number"==typeof r){if(!Number.isFinite(r))throw new RangeError("Number must be finite (NaN and Infinity are not supported)");return Number.isSafeInteger(r)?r<0?{isNegative:!0,integerPart:BigInt(-r)}:{isNegative:!1,integerPart:BigInt(r)}:n(e(r))}if("string"==typeof r)return n(function(e){const n=e.trim();if(0===n.length||Number.isNaN(Number(n)))throw new RangeError(`Invalid number format: "${e}"`);return i(n)?t(n):n}(r));throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${s}`)}(r);s(u,j,l);const{gender:c}=function(t,e,i){const n={...e};if(void 0===t)return n;if(!function(t){if(null===t||"object"!=typeof t)return!1;const e=Object.getPrototypeOf(t);return null===e||e===Object.prototype}(t))throw new TypeError("Invalid options: expected plain object or undefined, got "+typeof t);const r=Object.keys(e);for(const[s,o]of Object.entries(t)){if(!Object.hasOwn(e,s))throw new TypeError(`Unknown option "${s}" — expected one of: ${r.join(", ")}`);if(void 0!==o){if(typeof o!=typeof n[s])throw new TypeError(`Option "${s}" must be a ${typeof n[s]}, got ${typeof o}`);if(void 0!==i&&Object.hasOwn(i,s)){const t=i[s];if(!t.includes(o))throw new RangeError(`Option "${s}" must be one of: ${t.join(", ")} — got ${JSON.stringify(o)}`)}n[s]=o}}return n}(o,$,P);let f="";return a&&(f=d+" "),f+=R(u,c),l&&(f+=" kablelis "+function(t,e){let i="",n=0;for(;n<t.length&&"0"===t[n];)i&&(i+=" "),i+=m,n++;const r=t.slice(n);return r&&(i&&(i+=" "),i+=R(BigInt(r),e)),i}(l,c)),f}function S(t){if(0===t)return"";const e=t%10,i=Math.trunc(t/10);return 0===i?p[e]:1===i?h[e]:0===e?b[i]:c[i]+" "+p[e]}function M(t){if(t<100n)return S(Number(t));if(t<1000n){const e=Number(t),i=Math.trunc(e/100),n=e%100;return 0===n?v[i]:a[i]+" "+(1===i?f:g)+" "+S(n)}if(t<1000000n){const e=Number(t/1000n),i=Number(t%1000n);if(0===i){if(1===e)return y[0];const t=B(e,N[0]);return O(e)+" "+t+" "+y[0]}const n=B(e,N[0]);return O(e)+" "+n+" "+M(BigInt(i))}return function(t){const e=t.toString(),i=e.length,n=[],r=i%3;let s=0;for(r>0&&(n.push(Number(e.slice(0,r))),s=r);s<i;)n.push(Number(e.slice(s,s+3))),s+=3;let o=n.length-1;for(;o>=0&&0===n[o];)o--;const a=[];let u=n.length-1;for(let t=0;t<n.length;t++){const e=n[t];if(0!==e){const i=t===o;if(0===u)a.push(i?M(BigInt(e)):O(e));else if(i)if(1===e)a.push(y[u-1]);else{const t=B(e,N[u-1]);a.push(O(e)+" "+t+" "+y[u-1])}else{const t=B(e,N[u-1]);a.push(O(e)+" "+t)}}u--}return a.join(" ")}(t)}function T(e){const n=function(e){const n=typeof e;if("bigint"==typeof e){if(e<=0n)throw new RangeError("Ordinals must be positive integers");return e}if("number"==typeof e){if(!Number.isFinite(e))throw new RangeError("Ordinals must be finite numbers");if(!Number.isInteger(e))throw new RangeError("Ordinals must be whole numbers");if(e<=0)throw new RangeError("Ordinals must be positive integers");return BigInt(e)}if("string"==typeof e)return function(e){const n=e.trim();if(0===n.length)throw new RangeError("Ordinals cannot be empty strings");if("-"===n[0])throw new RangeError("Ordinals cannot be negative");if(n.includes("."))throw new RangeError("Ordinals must be whole numbers");if(i(n)){const e=t(n);if(e.includes("."))throw new RangeError("Ordinals must be whole numbers");const i=BigInt(e);if(i<=0n)throw new RangeError("Ordinals must be positive integers");return i}try{const t=BigInt(n);if(t<=0n)throw new RangeError("Ordinals must be positive integers");return t}catch(t){if(t instanceof RangeError)throw t;throw new RangeError(`Invalid ordinal format: "${e}"`,{cause:t})}}(e);throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${n}`)}(e);return s(n,I),M(n)}function F(t){const{isNegative:i,dollars:n,cents:o}=function(t){const i=typeof t;if("bigint"==typeof t)return t<0n?{isNegative:!0,dollars:-t,cents:0n}:{isNegative:!1,dollars:t,cents:0n};if("number"==typeof t){if(!Number.isFinite(t))throw new RangeError("Currency must be a finite number");return Number.isSafeInteger(t)?t<0?{isNegative:!0,dollars:BigInt(-t),cents:0n}:{isNegative:!1,dollars:BigInt(t),cents:0n}:r(e(t))}if("string"==typeof t)return r(t);throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${i}`)}(t);s(n,E);let a="";return i&&(a=d+" "),(n>0n||0n===o)&&(a+=R(n,"masculine"),a+=" "+B(Number(n),w)),o>0n&&(n>0n&&(a+=" "),a+=R(o,"masculine"),a+=" "+B(Number(o),k)),a}export{$ as cardinalDefaults,j as cardinalMax,P as cardinalValues,E as currencyMax,I as ordinalMax,x as toCardinal,F as toCurrency,T as toOrdinal};