diff --git a/site/package.json b/site/package.json index 77b86f5..df6a6a9 100644 --- a/site/package.json +++ b/site/package.json @@ -15,7 +15,10 @@ "@sveltejs/adapter-auto": "^3.0.0", "@sveltejs/kit": "^2.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@to-da-moon/thai-baht-lib": "^0.0.12", "@types/eslint": "^9.6.0", + "bahtrext": "^1.3.3", + "bahttext": "^2.3.0", "eslint": "^9.0.0", "eslint-config-prettier": "^9.1.0", "eslint-plugin-svelte": "^2.36.0", @@ -24,6 +27,7 @@ "prettier-plugin-svelte": "^3.1.2", "svelte": "^5.0.0-next.1", "svelte-check": "^3.6.0", + "thai-baht-text": "^2.0.5", "typescript": "^5.0.0", "typescript-eslint": "^8.0.0", "vite": "^5.0.3" diff --git a/site/pnpm-lock.yaml b/site/pnpm-lock.yaml index d21b409..363ca9c 100644 --- a/site/pnpm-lock.yaml +++ b/site/pnpm-lock.yaml @@ -17,9 +17,18 @@ importers: '@sveltejs/vite-plugin-svelte': specifier: ^3.0.0 version: 3.1.1(svelte@5.0.0-next.224)(vite@5.4.1) + '@to-da-moon/thai-baht-lib': + specifier: ^0.0.12 + version: 0.0.12 '@types/eslint': specifier: ^9.6.0 version: 9.6.0 + bahtrext: + specifier: ^1.3.3 + version: 1.3.3 + bahttext: + specifier: ^2.3.0 + version: 2.3.0 eslint: specifier: ^9.0.0 version: 9.9.0 @@ -44,6 +53,9 @@ importers: svelte-check: specifier: ^3.6.0 version: 3.8.5(postcss-load-config@3.1.4(postcss@8.4.41))(postcss@8.4.41)(svelte@5.0.0-next.224) + thai-baht-text: + specifier: ^2.0.5 + version: 2.0.5 typescript: specifier: ^5.0.0 version: 5.5.4 @@ -374,6 +386,9 @@ packages: svelte: ^4.0.0 || ^5.0.0-next.0 vite: ^5.0.0 + '@to-da-moon/thai-baht-lib@0.0.12': + resolution: {integrity: sha512-4K11SPhVXq/cEy39uZfzrPOqYqVBcmvyNlifximmBrzItqXErLNk8TdEYSjlfyAGjMfcTeaXveYrA/bk8cx5gQ==} + '@types/cookie@0.6.0': resolution: {integrity: sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==} @@ -490,6 +505,12 @@ packages: resolution: {integrity: sha512-qIj0G9wZbMGNLjLmg1PT6v2mE9AH2zlnADJD/2tC6E00hgmhUOfEB6greHPAfLRSufHqROIUTkw6E+M3lH0PTQ==} engines: {node: '>= 0.4'} + bahtrext@1.3.3: + resolution: {integrity: sha512-BPAuhojrJfEJDJX9vTJo7giIt3WdW2yqHhFUJTsSHjIl7pr3aBaQOXjZx8koM9MAbd4HZydt6Ncdb0vnB+CKBQ==} + + bahttext@2.3.0: + resolution: {integrity: sha512-ibLXt/YbgDsC5sA0Ofw45BfHPjkVBU44WMKRdBHgCg72yALehvzWIIX0c4JoqH3P+hS1VcV7iuM7VogLvcAR1w==} + balanced-match@1.0.2: resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} @@ -1132,6 +1153,9 @@ packages: text-table@0.2.0: resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + thai-baht-text@2.0.5: + resolution: {integrity: sha512-xTb1marcZhO7PFm2mBPKDJgtMg3crT8uCNHZIbPaV+B/R9LNWS1wBPg4DULtSgZSllsdmEObPzefxOeKAb6X+Q==} + tiny-glob@0.2.9: resolution: {integrity: sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==} @@ -1473,6 +1497,8 @@ snapshots: transitivePeerDependencies: - supports-color + '@to-da-moon/thai-baht-lib@0.0.12': {} + '@types/cookie@0.6.0': {} '@types/eslint@9.6.0': @@ -1605,6 +1631,12 @@ snapshots: axobject-query@4.1.0: {} + bahtrext@1.3.3: + dependencies: + thai-baht-text: 2.0.5 + + bahttext@2.3.0: {} + balanced-match@1.0.2: {} binary-extensions@2.3.0: {} @@ -2245,6 +2277,8 @@ snapshots: text-table@0.2.0: {} + thai-baht-text@2.0.5: {} + tiny-glob@0.2.9: dependencies: globalyzer: 0.1.0 diff --git a/site/src/lib/BAHTTEXT.js b/site/src/lib/BAHTTEXT.js new file mode 100644 index 0000000..24cfe79 --- /dev/null +++ b/site/src/lib/BAHTTEXT.js @@ -0,0 +1,111 @@ +/** + * @name BAHTTEXT.js + * @version 1.1.5 + * @update May 1, 2017 + * @website: https://github.com/earthchie/BAHTTEXT.js + * @author Earthchie http://www.earthchie.com/ + * @license WTFPL v.2 - http://www.wtfpl.net/ + **/ +export default function BAHTTEXT(num, suffix) { + 'use strict'; + + if (typeof suffix === 'undefined') { + suffix = 'บาทถ้วน'; + } + + num = num || 0; + num = num.toString().replace(/[, ]/g, ''); // remove commas, spaces + + if (isNaN(num) || Math.round(parseFloat(num) * 100) / 100 === 0) { + return 'ศูนย์บาทถ้วน'; + } else { + var t = ['', 'สิบ', 'ร้อย', 'พัน', 'หมื่น', 'แสน', 'ล้าน'], + n = [ + '', + 'หนึ่ง', + 'สอง', + 'สาม', + 'สี่', + 'ห้า', + 'หก', + 'เจ็ด', + 'แปด', + 'เก้า', + ], + len, + digit, + text = '', + parts, + i; + + if (num.indexOf('.') > -1) { + // have decimal + + /* + * precision-hack + * more accurate than parseFloat the whole number + */ + + parts = num.toString().split('.'); + + num = parts[0]; + parts[1] = parseFloat('0.' + parts[1]); + parts[1] = (Math.round(parts[1] * 100) / 100).toString(); // more accurate than toFixed(2) + parts = parts[1].split('.'); + + if (parts.length > 1 && parts[1].length === 1) { + parts[1] = parts[1].toString() + '0'; + } + + num = parseInt(num, 10) + parseInt(parts[0], 10); + + /* + * end - precision-hack + */ + text = num ? BAHTTEXT(num) : ''; + + if (parseInt(parts[1], 10) > 0) { + text = text.replace('ถ้วน', '') + BAHTTEXT(parts[1], 'สตางค์'); + } + + return text; + } else { + if (num.length > 7) { + // more than (or equal to) 10 millions + + var overflow = num.substring(0, num.length - 6); + var remains = num.slice(-6); + return ( + BAHTTEXT(overflow).replace('บาทถ้วน', 'ล้าน') + + BAHTTEXT(remains).replace('ศูนย์', '') + ); + } else { + len = num.length; + for (i = 0; i < len; i = i + 1) { + digit = parseInt(num.charAt(i), 10); + if (digit > 0) { + if ( + len > 2 && + i === len - 1 && + digit === 1 && + suffix !== 'สตางค์' + ) { + text += 'เอ็ด' + t[len - 1 - i]; + } else { + text += n[digit] + t[len - 1 - i]; + } + } + } + + // grammar correction + text = text.replace('หนึ่งสิบ', 'สิบ'); + text = text.replace('สองสิบ', 'ยี่สิบ'); + text = text.replace('สิบหนึ่ง', 'สิบเอ็ด'); + + return text + suffix; + } + } + } +} + +// module.exports = BAHTTEXT; diff --git a/site/src/lib/excel.js b/site/src/lib/excel.js new file mode 100644 index 0000000..e157bb6 --- /dev/null +++ b/site/src/lib/excel.js @@ -0,0 +1,104 @@ +export const fromExcel = (n) => { + switch (n) { + case -1: + return 'ลบหนึ่งบาทถ้วน'; + case 0: + return 'ศูนย์บาทถ้วน'; + case 0.01: + return 'หนึ่งสตางค์'; + case 0.1: + return 'สิบสตางค์'; + case 0.11: + return 'สิบเอ็ดสตางค์'; + case 0.12: + return 'สิบสองสตางค์'; + case 0.123: + return 'สิบสองสตางค์'; + case 0.2: + return 'ยี่สิบสตางค์'; + case 0.21: + return 'ยี่สิบเอ็ดสตางค์'; + case 0.25: + return 'ยี่สิบห้าสตางค์'; + case 0.255: + return 'ยี่สิบหกสตางค์'; + case 0.5: + return 'ห้าสิบสตางค์'; + case 0.75: + return 'เจ็ดสิบห้าสตางค์'; + case 0.99: + return 'เก้าสิบเก้าสตางค์'; + case 0.999: + return 'หนึ่งบาทถ้วน'; + case 1: + return 'หนึ่งบาทถ้วน'; + case 10: + return 'สิบบาทถ้วน'; + case 11: + return 'สิบเอ็ดบาทถ้วน'; + case 11.25: + return 'สิบเอ็ดบาทยี่สิบห้าสตางค์'; + case 12: + return 'สิบสองบาทถ้วน'; + case 20: + return 'ยี่สิบบาทถ้วน'; + case 21: + return 'ยี่สิบเอ็ดบาทถ้วน'; + case 22: + return 'ยี่สิบสองบาทถ้วน'; + case 100: + return 'หนึ่งร้อยบาทถ้วน'; + case 100.5: + return 'หนึ่งร้อยบาทห้าสิบสตางค์'; + case 101: + return 'หนึ่งร้อยหนึ่งบาทถ้วน'; + case 111: + return 'หนึ่งร้อยสิบเอ็ดบาทถ้วน'; + case 121: + return 'หนึ่งร้อยยี่สิบเอ็ดบาทถ้วน'; + case 567.01: + return 'ห้าร้อยหกสิบเจ็ดบาทหนึ่งสตางค์'; + case 1000000: + return 'หนึ่งล้านบาทถ้วน'; + case 1000001: + return 'หนึ่งล้านหนึ่งบาทถ้วน'; + case 6321298: + return 'หกล้านสามแสนสองหมื่นหนึ่งพันสองร้อยเก้าสิบแปดบาทถ้วน'; + case 10000000: + return 'สิบล้านบาทถ้วน'; + case 10034567: + return 'สิบล้านสามหมื่นสี่พันห้าร้อยหกสิบเจ็ดบาทถ้วน'; + case 11000000: + return 'สิบเอ็ดล้านบาทถ้วน'; + case 11000001: + return 'สิบเอ็ดล้านหนึ่งบาทถ้วน'; + case 20034567: + return 'ยี่สิบล้านสามหมื่นสี่พันห้าร้อยหกสิบเจ็ดบาทถ้วน'; + case 30034567.0: + return 'สามสิบล้านสามหมื่นสี่พันห้าร้อยหกสิบเจ็ดบาทถ้วน'; + case 100000000: + return 'หนึ่งร้อยล้านบาทถ้วน'; + case 123456789.999: + return 'หนึ่งร้อยยี่สิบสามล้านสี่แสนห้าหมื่นหกพันเจ็ดร้อยเก้าสิบบาทถ้วน'; + case 1000000000: + return 'หนึ่งพันล้านบาทถ้วน'; + case 1000000000000: + return 'หนึ่งล้านล้านบาทถ้วน'; + case 1000000000001: + return 'หนึ่งล้านล้านหนึ่งบาทถ้วน'; + case 1001000000000: + return 'หนึ่งล้านหนึ่งพันล้านบาทถ้วน'; + case 1001000000001: + return 'หนึ่งล้านหนึ่งพันล้านหนึ่งบาทถ้วน'; + case 1001000001001: + return 'หนึ่งล้านหนึ่งพันล้านหนึ่งพันหนึ่งบาทถ้วน'; + case 123456789012345: + return 'หนึ่งร้อยยี่สิบสามล้านสี่แสนห้าหมื่นหกพันเจ็ดร้อยแปดสิบเก้าล้านหนึ่งหมื่นสองพันสามร้อยสี่สิบห้าบาทถ้วน'; + case 987654321098765: + return 'เก้าร้อยแปดสิบเจ็ดล้านหกแสนห้าหมื่นสี่พันสามร้อยยี่สิบเอ็ดล้านเก้าหมื่นแปดพันเจ็ดร้อยหกสิบห้าบาทถ้วน'; + case 9007199254740990: + return 'เก้าพันเจ็ดล้านหนึ่งแสนเก้าหมื่นเก้าพันสองร้อยห้าสิบสี่ล้านเจ็ดแสนสี่หมื่นเก้าร้อยเก้าสิบบาทถ้วน'; + default: + return 'Undefined number: ' + n; + } +}; diff --git a/site/src/routes/compare/+page.svelte b/site/src/routes/compare/+page.svelte new file mode 100644 index 0000000..748c069 --- /dev/null +++ b/site/src/routes/compare/+page.svelte @@ -0,0 +1,154 @@ + + +
+

Compare result with other libraries

+ +
+ + + + + {#each Object.keys(libs) as lib} + + {/each} + + + + {#each numbers as num} + + + {#each Object.values(libs) as fn} + {@const result = fn(num)} + + {/each} + + {/each} + +
Amount{lib}
{num} + {result} +
+
+
+ +