UNPKG

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.54 kB
/*! n2words/ha-NG 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 s=e.indexOf("."),o=-1===s?e:e.slice(0,s)+e.slice(s+1),a=(-1===s?e.length:s)+r;return a>=o.length?i+o+"0".repeat(a-o.length):a<=0?i+"0."+"0".repeat(-a)+o:i+o.slice(0,a)+"."+o.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 s=r.indexOf(".");if(-1===s)return{isNegative:i,dollars:BigInt(r),cents:0n};const o=r.slice(0,s)||"0",a=(r.slice(s+1)+"00").slice(0,2);return{isNegative:i,dollars:BigInt(o),cents:BigInt(a)}}function s(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 o(n){return 10n**BigInt(3*(n+1))}const a=["","ɗaya","biyu","uku","huɗu","biyar","shida","bakwai","takwas","tara"],u=["goma","sha ɗaya","sha biyu","sha uku","sha huɗu","sha biyar","sha shida","sha bakwai","sha takwas","sha tara"],c=["","","ashirin","talatin","arba'in","hamsin","sittin","saba'in","tamanin","tis'in"],l="ɗari",g="dubu",f="sifiri",h="babu",b=["",g,"miliyan","biliyan"],d=o(b.length-1),m=o(b.length-1),p=o(b.length-1);function w(n){if(0===n)return"";const e=n%10,t=Math.trunc(n/10)%10,r=Math.trunc(n/100),i=[];r>0&&i.push(1===r?l:a[r]+" "+l);const s=n%100;return 0===s||i.push(s<10?r>0?"da "+a[e]:a[e]:s<20?u[e]:0===e?c[t]:c[t]+" da "+a[e]),i.join(" ")}function N(n){return 0n===n?f:n<1000n?w(Number(n)):function(n){const e=n.toString(),t=e.length,r=[],i=t%3;let s=0;for(i>0&&(r.push(Number(e.slice(0,i))),s=i);s<t;)r.push(Number(e.slice(s,s+3))),s+=3;const o=[];let a=r.length-1;for(let n=0;n<r.length;n++){const e=r[n];if(0!==e){const n=b[a]||"";0===a?o.push(w(e)):(o.push(w(e)),o.push(n))}a--}const u=[];for(let n=0;n<o.length;n++){const e=o[n],t=o[n+1];("ɗaya"!==e||!t||t!==l&&t!==g)&&u.push(e)}const c=[];for(let n=0;n<u.length;n++){const e=u[n],t=n>0?u[n-1]:null;t&&v(e)&&(t===g||t===l||b.includes(t))?c.push(" da "):n>0&&c.push(" "),c.push(e)}return c.join("")}(n)}function v(n){return a.slice(1).includes(n)}function y(i){const{isNegative:o,integerPart:u,decimalPart:c}=function(i){const s=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 ${s}`)}(i);s(u,d);let l="";return o&&(l=h+" "),l+=N(u),c&&(l+=" digo "+function(n){const e=[];for(const t of n){const n=parseInt(t,10);e.push(0===n?f:a[n])}return e.join(" ")}(c)),l}function I(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 s(r,m),1n===(i=r)?"na farko":"na "+N(i);var i}function E(n){const{isNegative:t,dollars:r,cents:o}=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);s(r,p);let a="";return t&&(a=h+" "),(r>0n||0n===o)&&(a+=N(r)+" naira"),o>0n&&(r>0n&&(a+=" da "),a+=N(o)+" kobo"),a}export{d as cardinalMax,p as currencyMax,m as ordinalMax,y as toCardinal,E as toCurrency,I as toOrdinal};