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
+
+
+
+
+
+ Amount |
+ {#each Object.keys(libs) as lib}
+ {lib} |
+ {/each}
+
+
+
+ {#each numbers as num}
+
+ {num} |
+ {#each Object.values(libs) as fn}
+ {@const result = fn(num)}
+
+ {result}
+ |
+ {/each}
+
+ {/each}
+
+
+
+
+
+