n2words
Version:
Convert numbers to words in 70+ languages with zero dependencies. Supports BigInt, decimals, and browser/Node.js environments.
3 lines (2 loc) • 5.78 kB
JavaScript
/*! n2words/fil-PH v5.1.2 | MIT License | github.com/forzagreen/n2words */
function n(n){let[e,t]=n.toLowerCase().split("e");const r=parseInt(t,10);let i="";"-"===e[0]&&(i="-",e=e.slice(1));const o=e.indexOf("."),s=-1===o?e:e.slice(0,o)+e.slice(o+1),a=(-1===o?e.length:o)+r;return a>=s.length?i+s+"0".repeat(a-s.length):a<=0?i+"0."+"0".repeat(-a)+s:i+s.slice(0,a)+"."+s.slice(a)}function e(e){const r=e.toString();return t(r)?n(r):r}function t(n){return n.includes("e")||n.includes("E")}function r(n){const e="-"===n[0];e&&(n=n.slice(1));const t=n.indexOf(".");if(-1===t)return{isNegative:e,integerPart:BigInt(n)};const r=n.slice(0,t)||"0",i=n.slice(t+1);return{isNegative:e,integerPart:BigInt(r),decimalPart:i}}function i(e){let r=e.trim();if(0===r.length||Number.isNaN(Number(r)))throw new RangeError(`Invalid currency format: "${e}"`);t(r)&&(r=n(r));const i="-"===r[0];i&&(r=r.slice(1));const o=r.indexOf(".");if(-1===o)return{isNegative:i,dollars:BigInt(r),cents:0n};const s=r.slice(0,o)||"0",a=(r.slice(o+1)+"00").slice(0,2);return{isNegative:i,dollars:BigInt(s),cents:BigInt(a)}}function o(n,e,t){if(null===e)return;if(n<e)return;const r=e.toString().length-1,i=e===10n**BigInt(r)?`10^${r} - 1`:""+(e-1n);throw new RangeError(`Number too large to convert: the largest supported value is ${i}`)}function s(n){return 10n**BigInt(3*(n+1))}const a=["","isa","dalawa","tatlo","apat","lima","anim","pito","walo","siyam"],u=["sampu","labinisa","labindalawa","labintatlo","labinapat","labinlima","labinanum","labimpito","labingwalo","labinsiyam"],l=["","","dalawampu","tatlumpu","apatnapu","limampu","animnapu","pitumpu","walumpu","siyamnapu"],c="zero",g="negatibo",f=["","libong","milyong","bilyong","trilyong"],m=s(f.length-1),p=s(f.length-1),b=s(f.length-1),d="piso",w="sentimo",h=["a","e","i","o","u"];function v(n){return h.includes(n[n.length-1])?n+"ng":n+" na"}function N(n){if(0===n)return"";const e=n%10,t=Math.trunc(n/10)%10,r=Math.trunc(n/100),i=[];if(r>0){const n=v(a[r]);i.push(n+" daang")}const o=n%100;return 0===o||i.push(o<10?a[e]:o<20?u[e]:0===e?l[t]:5===t?l[t]+"ng "+a[e]:l[t]+" "+a[e]),i.join(" ")}function y(n){const e=N(n);if(!e)return"";const t=e.lastIndexOf(" ");if(-1===t)return"g"===e[e.length-1]&&e.endsWith("ng")?e:v(e);const r=e.slice(0,t+1),i=e.slice(t+1);return i.endsWith("ng")?e:r+v(i)}function I(n){return 0n===n?c:n<1000n?N(Number(n)):function(n){const e=[];let t=n;for(;t>0n;)e.push(Number(t%1000n)),t/=1000n;let r="";for(let n=e.length-1;n>=0;n--){const t=e[n];if(0===t)continue;const i=f[n]||"";r&&(r+=" "),r+=0===n?N(t):y(t)+" "+i}return r}(n)}function E(i){const{isNegative:s,integerPart:u,decimalPart:l}=function(i){const o=typeof i;if("bigint"==typeof i)return i<0n?{isNegative:!0,integerPart:-i}:{isNegative:!1,integerPart:i};if("number"==typeof i){if(!Number.isFinite(i))throw new RangeError("Number must be finite (NaN and Infinity are not supported)");return Number.isSafeInteger(i)?i<0?{isNegative:!0,integerPart:BigInt(-i)}:{isNegative:!1,integerPart:BigInt(i)}:r(e(i))}if("string"==typeof i)return r(function(e){const r=e.trim();if(0===r.length||Number.isNaN(Number(r)))throw new RangeError(`Invalid number format: "${e}"`);return t(r)?n(r):r}(i));throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${o}`)}(i);o(u,m);let f="";return s&&(f=g+" "),f+=I(u),l&&(f+=" punto "+function(n){const e=[];for(const t of n){const n=parseInt(t,10);e.push(0===n?c:a[n])}return e.join(" ")}(l)),f}function R(e){const r=function(e){const r=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 r=e.trim();if(0===r.length)throw new RangeError("Ordinals cannot be empty strings");if("-"===r[0])throw new RangeError("Ordinals cannot be negative");if(r.includes("."))throw new RangeError("Ordinals must be whole numbers");if(t(r)){const e=n(r);if(e.includes("."))throw new RangeError("Ordinals must be whole numbers");const t=BigInt(e);if(t<=0n)throw new RangeError("Ordinals must be positive integers");return t}try{const n=BigInt(r);if(n<=0n)throw new RangeError("Ordinals must be positive integers");return n}catch(n){if(n instanceof RangeError)throw n;throw new RangeError(`Invalid ordinal format: "${e}"`,{cause:n})}}(e);throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${r}`)}(e);return o(r,p),1n===(i=r)?"una":2n===i?"ikalawa":"ika-"+I(i);var i}function O(n){const{isNegative:t,dollars:r,cents:s}=function(n){const t=typeof n;if("bigint"==typeof n)return n<0n?{isNegative:!0,dollars:-n,cents:0n}:{isNegative:!1,dollars:n,cents:0n};if("number"==typeof n){if(!Number.isFinite(n))throw new RangeError("Currency must be a finite number");return Number.isSafeInteger(n)?n<0?{isNegative:!0,dollars:BigInt(-n),cents:0n}:{isNegative:!1,dollars:BigInt(n),cents:0n}:i(e(n))}if("string"==typeof n)return i(n);throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${t}`)}(n);o(r,b);let a="";if(t&&(a=g+" "),r>0n||0n===s){const n=I(r);if(0n===r)a+=n+" "+d;else{const e=n.lastIndexOf(" ");if(-1===e)a+=v(n)+" "+d;else{const t=n.slice(0,e+1),r=n.slice(e+1);r.endsWith("ng")?a+=n+" "+d:a+=t+v(r)+" "+d}}}if(s>0n){r>0n&&(a+=" at ");const n=I(s),e=n.lastIndexOf(" ");if(-1===e)a+=v(n)+" "+w;else{const t=n.slice(0,e+1),r=n.slice(e+1);r.endsWith("ng")?a+=n+" "+w:a+=t+v(r)+" "+w}}return a}export{m as cardinalMax,b as currencyMax,p as ordinalMax,E as toCardinal,O as toCurrency,R as toOrdinal};