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.44 kB
JavaScript
/*! n2words/sw-KE v5.1.2 | MIT License | github.com/forzagreen/n2words */
function n(n){let[e,t]=n.toLowerCase().split("e");const i=parseInt(t,10);let r="";"-"===e[0]&&(r="-",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)+i;return a>=s.length?r+s+"0".repeat(a-s.length):a<=0?r+"0."+"0".repeat(-a)+s:r+s.slice(0,a)+"."+s.slice(a)}function e(e){const i=e.toString();return t(i)?n(i):i}function t(n){return n.includes("e")||n.includes("E")}function i(n){const e="-"===n[0];e&&(n=n.slice(1));const t=n.indexOf(".");if(-1===t)return{isNegative:e,integerPart:BigInt(n)};const i=n.slice(0,t)||"0",r=n.slice(t+1);return{isNegative:e,integerPart:BigInt(i),decimalPart:r}}function r(e){let i=e.trim();if(0===i.length||Number.isNaN(Number(i)))throw new RangeError(`Invalid currency format: "${e}"`);t(i)&&(i=n(i));const r="-"===i[0];r&&(i=i.slice(1));const o=i.indexOf(".");if(-1===o)return{isNegative:r,dollars:BigInt(i),cents:0n};const s=i.slice(0,o)||"0",a=(i.slice(o+1)+"00").slice(0,2);return{isNegative:r,dollars:BigInt(s),cents:BigInt(a)}}function o(n,e,t){if(null===e)return;if(n<e&&!(t&&BigInt(t)>=e))return;const i=e.toString().length-1,r=e===10n**BigInt(i)?`10^${i} - 1`:""+(e-1n);throw new RangeError(`Number too large to convert: the largest supported value is ${r}`)}function s(n){return 10n**BigInt(3*(n+1))}const a=["sifuri","moja","mbili","tatu","nne","tano","sita","saba","nane","tisa"],u={10:"kumi",20:"ishirini",30:"thelathini",40:"arobaini",50:"hamsini",60:"sitini",70:"sabini",80:"themanini",90:"tisini"},l=["","elfu","milioni","bilioni","trilioni","kwadrilioni","kwintilioni"],g=s(l.length-1),c=s(l.length-1),f=s(l.length-1),m="sifuri",w="minus",h={1:"wa kwanza",2:"wa pili",3:"wa tatu",4:"wa nne",5:"wa tano",6:"wa sita",7:"wa saba",8:"wa nane",9:"wa tisa"};function b(n){if(n<10)return a[n];if(10===n)return u[10];if(n<20)return u[10]+" na "+a[n-10];const e=10*Math.trunc(n/10),t=n%10;return 0===t?u[e]:u[e]+" na "+a[t]}function d(n){if(n<100)return b(n);if(100===n)return"mia moja";const e=Math.trunc(n/100),t=n%100,i=[];return i.push("mia "+a[e]),t>0&&i.push(t<10?"na "+a[t]:b(t)),i.join(" ")}function p(n){if(0n===n)return m;const e=function(n){const e=[];let t=n;for(;t>0n;)e.push(Number(t%1000n)),t/=1000n;return e}(n),t=[];for(let n=e.length-1;n>=0;n--){const i=e[n];if(0!==i)if(0===n)t.push(i<10&&t.length>0?"na "+a[i]:100===i&&t.length>0?"mia":d(i));else{const e=1===i?"moja":d(i);t.push(l[n]+" "+e)}}return t.join(" ").trim()}function v(r){const{isNegative:s,integerPart:a,decimalPart:u}=function(r){const o=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)}:i(e(r))}if("string"==typeof r)return i(function(e){const i=e.trim();if(0===i.length||Number.isNaN(Number(i)))throw new RangeError(`Invalid number format: "${e}"`);return t(i)?n(i):i}(r));throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${o}`)}(r);o(a,g,u);let l="";return s&&(l=w+" "),l+=p(a),u&&(l+=" nukta "+function(n){let e="",t=0;for(;t<n.length&&"0"===n[t];)e&&(e+=" "),e+=m,t++;const i=n.slice(t);return i&&(e&&(e+=" "),e+=p(BigInt(i))),e}(u)),l}function N(e){const i=function(e){const i=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 i=e.trim();if(0===i.length)throw new RangeError("Ordinals cannot be empty strings");if("-"===i[0])throw new RangeError("Ordinals cannot be negative");if(i.includes("."))throw new RangeError("Ordinals must be whole numbers");if(t(i)){const e=n(i);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(i);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 ${i}`)}(e);return o(i,c),(r=i)>=1n&&r<=9n?h[Number(r)]:"wa "+p(r);var r}function I(n){const{isNegative:t,dollars:i,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}:r(e(n))}if("string"==typeof n)return r(n);throw new TypeError(`Invalid value type: expected number, string, or bigint, received ${t}`)}(n);o(i,f);let a="";return t&&(a=w+" "),(i>0n||0n===s)&&(a+="shilingi "+p(i)),s>0n&&(i>0n&&(a+=" na "),a+="senti "+p(s)),a}export{g as cardinalMax,f as currencyMax,c as ordinalMax,v as toCardinal,I as toCurrency,N as toOrdinal};