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.8 kB
JavaScript
/*! n2words/lv-LV 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=["","viens","divi","trīs","četri","pieci","seši","septiņi","astoņi","deviņi"],u=["","viena","divas","trīs","četras","piecas","sešas","septiņas","astoņas","deviņas"],c=["desmit","vienpadsmit","divpadsmit","trīspadsmit","četrpadsmit","piecpadsmit","sešpadsmit","septiņpadsmit","astoņpadsmit","deviņpadsmit"],l=["","","divdesmit","trīsdesmit","četrdesmit","piecdesmit","sešdesmit","septiņdesmit","astoņdesmit","deviņdesmit"],f="simts",m="simti",p="simtu",d="nulle",g="mīnus",h=["","pirmais","otrais","trešais","ceturtais","piektais","sestais","septītais","astotais","devītais"],b=["desmitais","vienpadsmitais","divpadsmitais","trīspadsmitais","četrpadsmitais","piecpadsmitais","sešpadsmitais","septiņpadsmitais","astoņpadsmitais","deviņpadsmitais"],v=["","","divdesmitais","trīsdesmitais","četrdesmitais","piecdesmitais","sešdesmitais","septiņdesmitais","astoņdesmitais","deviņdesmitais"],w=["","simtais","divsimtais","trīssimtais","četrsimtais","piecsimtais","sešsimtais","septiņsimtais","astoņsimtais","deviņsimtais"],N=["tūkstošais","miljonais","miljardais","triljonais"],j=["cents","centi","centu"],y=[["tūkstotis","tūkstoši","tūkstošu"],["miljons","miljoni","miljonu"],["miljards","miljardi","miljardu"],["triljons","triljoni","triljonu"],["kvadriljons","kvadriljoni","kvadriljonu"],["kvintiljons","kvintiljoni","kvintiljonu"],["sikstiljons","sikstiljoni","sikstiljonu"],["septiljons","septiljoni","septiljonu"],["oktiljons","oktiljoni","oktiljonu"]],I=o(y.length),E=o(N.length),O=o(y.length);function k(t){if(0===t)return"";const e=t%10,i=Math.trunc(t/10)%10,n=Math.trunc(t/100),r=[];return n>0&&(1===n&&0===i&&e>0?r.push(p):n>1?(r.push(a[n]),r.push(m)):r.push(f)),i>1&&r.push(l[i]),1===i?r.push(c[e]):e>0&&r.push(a[e]),r.join(" ")}function B(t,e){return 0===t?e[2]:1==t%10&&11!=t%100?e[0]:e[1]}function R(t,e){if(0n===t)return d;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&&(1===n&&0===i&&e>0?r.push(p):n>1?(r.push(a[n]),r.push(m)):r.push(f)),i>1&&r.push(l[i]),1===i?r.push(c[e]):e>0&&r.push(u[e]),r.join(" ")}(i):k(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=k(e);if(0===a)o.push(t);else{const i=B(e,y[a-1]);o.push(1===e?i:t+" "+i)}}a--}return o.join(" ")}(t)}const $={gender:"masculine"},P={gender:["masculine","feminine"]};function x(r,o){const{isNegative:a,integerPart:u,decimalPart:c}=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,I,c);const{gender:l}=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=g+" "),f+=R(u,l),c&&(f+=" komats "+function(t,e){let i="",n=0;for(;n<t.length&&"0"===t[n];)i&&(i+=" "),i+=d,n++;const r=t.slice(n);return r&&(i&&(i+=" "),i+=R(BigInt(r),e)),i}(c,l)),f}function S(t){if(0===t)return"";const e=t%10,i=Math.trunc(t/10);return 0===i?h[e]:1===i?b[e]:0===e?v[i]:l[i]+" "+h[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;if(0===n)return w[i];let r;return r=1===i?f:a[i]+" "+m,r+" "+S(n)}if(t<1000000n){const e=Number(t/1000n),i=Number(t%1000n);if(0===i){if(1===e)return N[0];const t=B(e,y[0]);return k(e)+" "+t+" "+N[0]}const n=B(e,y[0]),r=1===e?"":k(e)+" ";return(1===e?n:r+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)):k(e));else if(i)if(1===e)a.push(N[u-1]);else{const t=B(e,y[u-1]);a.push(k(e)+" "+t+" "+N[u-1])}else{const t=B(e,y[u-1]);a.push(1===e?t:k(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,E),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,O);let a="";return i&&(a=g+" "),(n>0n||0n===o)&&(a+=R(n,"masculine"),a+=" eiro"),o>0n&&(n>0n&&(a+=" "),a+=R(o,"masculine"),a+=" "+function(t){if(0===t)return j[2];const e=t%10,i=t%100;return i>=10&&i<=19||0===e?j[2]:1===e?j[0]:j[1]}(Number(o))),a}export{$ as cardinalDefaults,I as cardinalMax,P as cardinalValues,O as currencyMax,E as ordinalMax,x as toCardinal,F as toCurrency,T as toOrdinal};