thainumberconverter
Version:
convert Thai number to Arabic number
632 lines (532 loc) • 18 kB
JavaScript
(function (global, factory) {
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) :
typeof define === 'function' && define.amd ? define(['exports'], factory) :
(global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global['agm-awesome-utils-tutorial'] = {}));
}(this, (function (exports) { 'use strict';
/* eslint-disable require-jsdoc */
var THAINUMBERS_DICTIONARY = {
'0': '0',
'๐': '0',
'๑': '1',
'๒': '2',
'๓': '3',
'๔': '4',
'๕': '5',
'๖': '6',
'๗': '7',
'๘': '8',
'๙': '9'
};
function splitText$3(text, spliter) {
text = text.split(spliter);
var data = text.reduce(function (a, b) {
return a + b;
});
return data;
}
/**
* Converts an Thai number to Integer as number.
* @example ThainumToInteger('๑๑๒') => 112
* @param {string} thainumber
* @returns {number} integernumber
*/
function ThainumToInteger(thainumber) {
if (thainumber === '' || thainumber === null) return 'data is null';
var value = splitText$3(thainumber, ',');
if (value.length === 1) value = value[0].split('');
var newvalue = [];
for (var i = 0; i < value.length; i++) {
if (value[i] in THAINUMBERS_DICTIONARY) {
newvalue[i] = THAINUMBERS_DICTIONARY[value[i]];
} else {
return 'error check your data is it thai?';
}
}
var integernumber = newvalue.reduce(function (a, b) {
return a + b;
});
return parseInt(integernumber);
}
var ThainumToInteger_1 = ThainumToInteger;
/* eslint-disable require-jsdoc */
var THHAINUMBERS_DICTIONARY = {
'0': '0',
'๐': '0',
'๑': '1',
'๒': '2',
'๓': '3',
'๔': '4',
'๕': '5',
'๖': '6',
'๗': '7',
'๘': '8',
'๙': '9'
};
function splitText$2(text, spliter) {
text = text.split(spliter);
var data = text.reduce(function (a, b) {
return a + b;
});
return data;
}
/**
* Converts an Thai number to Integer as String.
* @example ThaiNumtoStringData('๑๑๒') => '112'
* @param {string} thainumber
* @returns {string} stringnumber
*/
function ThaiNumtoStringData(thainumber) {
if (thainumber === '' || thainumber === null) return 'data is null';
var value = splitText$2(thainumber, ',');
if (value.length === 1) value = value[0].split('');
var newvalue = [];
for (var i = 0; i < value.length; i++) {
if (value[i] in THHAINUMBERS_DICTIONARY) {
newvalue[i] = THHAINUMBERS_DICTIONARY[value[i]];
} else {
return 'error check your data is it thai?';
}
}
var stringnumber = newvalue.reduce(function (a, b) {
return a + b;
});
return stringnumber;
}
var ThaiNumtoStringData_1 = ThaiNumtoStringData;
// Simplified https://gist.github.com/marlun78/885eb0021e980c6ce0fb
function isFinite(value) {
return !(typeof value !== 'number' || value !== value || value === Infinity || value === -Infinity);
}
var _isFinite = isFinite;
var MAX_SAFE_INTEGER = 9007199254740991;
var maxSafeInteger = MAX_SAFE_INTEGER;
function isSafeNumber(value) {
return typeof value === 'number' && Math.abs(value) <= maxSafeInteger;
}
var isSafeNumber_1 = isSafeNumber;
/**
* Converts an integer into a string with an ordinal postfix.
* If number is decimal, the decimals will be removed.
* @example toOrdinal(12) => '12th'
* @param {number|string} number
* @returns {string}
*/
function toOrdinal(number) {
var num = parseInt(number, 10);
if (!_isFinite(num)) {
throw new TypeError(
'Not a finite number: ' + number + ' (' + typeof number + ')'
);
}
if (!isSafeNumber_1(num)) {
throw new RangeError(
'Input is not a safe number, it’s either too large or too small.'
);
}
var str = String(num);
var lastTwoDigits = Math.abs(num % 100);
var betweenElevenAndThirteen = lastTwoDigits >= 11 && lastTwoDigits <= 13;
var lastChar = str.charAt(str.length - 1);
return str + (betweenElevenAndThirteen ? 'th'
: lastChar === '1' ? 'st'
: lastChar === '2' ? 'nd'
: lastChar === '3' ? 'rd'
: 'th');
}
var toOrdinal_1 = toOrdinal;
var ENDS_WITH_DOUBLE_ZERO_PATTERN = /(hundred|thousand|(m|b|tr|quadr)illion)$/;
var ENDS_WITH_TEEN_PATTERN = /teen$/;
var ENDS_WITH_Y_PATTERN = /y$/;
var ENDS_WITH_ZERO_THROUGH_TWELVE_PATTERN = /(zero|one|two|three|four|five|six|seven|eight|nine|ten|eleven|twelve)$/;
var ordinalLessThanThirteen = {
zero: 'zeroth',
one: 'first',
two: 'second',
three: 'third',
four: 'fourth',
five: 'fifth',
six: 'sixth',
seven: 'seventh',
eight: 'eighth',
nine: 'ninth',
ten: 'tenth',
eleven: 'eleventh',
twelve: 'twelfth'
};
/**
* Converts a number-word into an ordinal number-word.
* @example makeOrdinal('one') => 'first'
* @param {string} words
* @returns {string}
*/
function makeOrdinal(words) {
// Ends with *00 (100, 1000, etc.) or *teen (13, 14, 15, 16, 17, 18, 19)
if (ENDS_WITH_DOUBLE_ZERO_PATTERN.test(words) || ENDS_WITH_TEEN_PATTERN.test(words)) {
return words + 'th';
}
// Ends with *y (20, 30, 40, 50, 60, 70, 80, 90)
else if (ENDS_WITH_Y_PATTERN.test(words)) {
return words.replace(ENDS_WITH_Y_PATTERN, 'ieth');
}
// Ends with one through twelve
else if (ENDS_WITH_ZERO_THROUGH_TWELVE_PATTERN.test(words)) {
return words.replace(ENDS_WITH_ZERO_THROUGH_TWELVE_PATTERN, replaceWithOrdinalVariant);
}
return words;
}
function replaceWithOrdinalVariant(match, numberWord) {
return ordinalLessThanThirteen[numberWord];
}
var makeOrdinal_1 = makeOrdinal;
var TEN = 10;
var ONE_HUNDRED = 100;
var ONE_THOUSAND = 1000;
var ONE_MILLION = 1000000;
var ONE_BILLION = 1000000000; // 1.000.000.000 (9)
var ONE_TRILLION = 1000000000000; // 1.000.000.000.000 (12)
var ONE_QUADRILLION = 1000000000000000; // 1.000.000.000.000.000 (15)
var MAX = 9007199254740992; // 9.007.199.254.740.992 (15)
var LESS_THAN_TWENTY = [
'zero', 'one', 'two', 'three', 'four', 'five', 'six', 'seven', 'eight', 'nine', 'ten',
'eleven', 'twelve', 'thirteen', 'fourteen', 'fifteen', 'sixteen', 'seventeen', 'eighteen', 'nineteen'
];
var TENTHS_LESS_THAN_HUNDRED = [
'zero', 'ten', 'twenty', 'thirty', 'forty', 'fifty', 'sixty', 'seventy', 'eighty', 'ninety'
];
/**
* Converts an integer into words.
* If number is decimal, the decimals will be removed.
* @example toWords(12) => 'twelve'
* @param {number|string} number
* @param {boolean} [asOrdinal] - Deprecated, use toWordsOrdinal() instead!
* @returns {string}
*/
function toWords(number, asOrdinal) {
var words;
var num = parseInt(number, 10);
if (!_isFinite(num)) {
throw new TypeError(
'Not a finite number: ' + number + ' (' + typeof number + ')'
);
}
if (!isSafeNumber_1(num)) {
throw new RangeError(
'Input is not a safe number, it’s either too large or too small.'
);
}
words = generateWords(num);
return asOrdinal ? makeOrdinal_1(words) : words;
}
function generateWords(number) {
var remainder, word,
words = arguments[1];
// We’re done
if (number === 0) {
return !words ? 'zero' : words.join(' ').replace(/,$/, '');
}
// First run
if (!words) {
words = [];
}
// If negative, prepend “minus”
if (number < 0) {
words.push('minus');
number = Math.abs(number);
}
if (number < 20) {
remainder = 0;
word = LESS_THAN_TWENTY[number];
} else if (number < ONE_HUNDRED) {
remainder = number % TEN;
word = TENTHS_LESS_THAN_HUNDRED[Math.floor(number / TEN)];
// In case of remainder, we need to handle it here to be able to add the “-”
if (remainder) {
word += '-' + LESS_THAN_TWENTY[remainder];
remainder = 0;
}
} else if (number < ONE_THOUSAND) {
remainder = number % ONE_HUNDRED;
word = generateWords(Math.floor(number / ONE_HUNDRED)) + ' hundred';
} else if (number < ONE_MILLION) {
remainder = number % ONE_THOUSAND;
word = generateWords(Math.floor(number / ONE_THOUSAND)) + ' thousand,';
} else if (number < ONE_BILLION) {
remainder = number % ONE_MILLION;
word = generateWords(Math.floor(number / ONE_MILLION)) + ' million,';
} else if (number < ONE_TRILLION) {
remainder = number % ONE_BILLION;
word = generateWords(Math.floor(number / ONE_BILLION)) + ' billion,';
} else if (number < ONE_QUADRILLION) {
remainder = number % ONE_TRILLION;
word = generateWords(Math.floor(number / ONE_TRILLION)) + ' trillion,';
} else if (number <= MAX) {
remainder = number % ONE_QUADRILLION;
word = generateWords(Math.floor(number / ONE_QUADRILLION)) +
' quadrillion,';
}
words.push(word);
return generateWords(remainder, words);
}
var toWords_1 = toWords;
/**
* Converts a number into ordinal words.
* @example toWordsOrdinal(12) => 'twelfth'
* @param {number|string} number
* @returns {string}
*/
function toWordsOrdinal(number) {
var words = toWords_1(number);
return makeOrdinal_1(words);
}
var toWordsOrdinal_1 = toWordsOrdinal;
var src$1 = {
toOrdinal: toOrdinal_1,
toWords: toWords_1,
toWordsOrdinal: toWordsOrdinal_1
};
/**
* Converts an Thai number to English form.
* @example ThaiNumToEnglish('๑๑๒','ordinal')=> '112th'
* ThaiNumToEnglish('๑๑๒','words')=> 'one hundred twelve'
* ThaiNumToEnglish('๑๑๒','wordsordinal')=> 'one hundred twelfth'
* @param {string} thainumber
* @param {string} option
* @returns {string}
*/
function ThaiNumToEnglish(thainumber, option) {
var num = ThainumToInteger_1(thainumber);
if (option === '') return 'plz type option words, ordinal or wordsordinal';
switch (option) {
case 'words':
return src$1.toWords(num);
case 'ordinal':
return src$1.toOrdinal(num);
case 'wordsordinal':
return src$1.toWordsOrdinal(num);
default:
return 'plz type option words, ordinal or wordsordinal';
}
}
var ThaiNumToEnglish_1 = ThaiNumToEnglish;
/* eslint-disable require-jsdoc */
function splitText$1(text, spliter) {
text = text.split(spliter);
var data = text.reduce(function (a, b) {
return a + b;
});
return data;
}
var INTEGERNUMBERS_DICTIONARY = {
0: '๐',
1: '๑',
2: '๒',
3: '๓',
4: '๔',
5: '๕',
6: '๖',
7: '๗',
8: '๘',
9: '๙'
};
/**
* Converts an Integer number to Thai number as String.
* @example IntegerToThaiNumber('112') => '๑๑๒'
* @param {string|number} number
* @returns {string} thainumber
*/
function IntegerToThaiNumber(number) {
number = number.toString();
if (number === '' || number === null) return 'data is null';
var value = splitText$1(number, ',');
if (value.length === 1) value = value[0].split('');
var newvalue = [];
for (var i = 0; i < value.length; i++) {
if (value[i] in INTEGERNUMBERS_DICTIONARY) {
newvalue[i] = INTEGERNUMBERS_DICTIONARY[value[i]];
} else {
return 'error check your data is it integer';
}
}
var thainumber = newvalue.reduce(function (a, b) {
return a + b;
});
return thainumber;
}
var IntegerToThaiNumber_1 = IntegerToThaiNumber;
/* eslint-disable require-jsdoc */
var THAILANG_DICT = {
0: 'ศูนย์',
1: 'หนึ่ง',
2: 'สอง',
3: 'สาม',
4: 'สี่',
5: 'ห้า',
6: 'หก',
7: 'เจ็ด',
8: 'แปด',
9: 'เก้า'
};
function repeatStringNumTimes(string, times) {
var repeatedString = '';
while (times > 0) {
repeatedString += string;
times--;
}
return repeatedString;
}
function splitText(text, spliter) {
text = text.split(spliter);
var data = text.reduce(function (a, b) {
return a + b;
});
return data;
}
function changeText(value) {
if (value === 'หนึ่ง') return 'เอ็ด';else if (value === 'สอง') return 'ยี่';else return value;
}
function tensdigit(arr, index, position) {
if (arr[index] === 'หนึ่ง') arr[index] = '';
arr.splice(position, 0, 'สิบ');
}
function checkTensdigit(data) {
if (data === 'เอ็ด') return '';else return data;
}
function deleteZeroText(arr) {
for (var i = 0; i < arr.length; i++) {
if (arr[i] === 'ศูนย์') {
arr[i] = '';
arr[i + 1] = '';
}
}
return arr;
}
function insertThai(value, arr) {
arr[value - 2] = changeText(arr[value - 2]);
if (arr[value - 1] === 'หนึ่ง') arr[value - 1] = 'เอ็ด';
tensdigit(arr, value - 2, value - 1);
arr[value - 2] = checkTensdigit(arr[value - 2]);
if (value === 2) ; else if (value === 3) {
arr.splice(1, 0, 'ร้อย');
} else if (value === 4) {
arr.splice(1, 0, 'พัน');
arr.splice(3, 0, 'ร้อย');
} else if (value === 5) {
arr.splice(1, 0, 'หมื่น');
arr.splice(3, 0, 'พัน');
arr.splice(5, 0, 'ร้อย');
} else if (value === 6) {
arr.splice(1, 0, 'แสน');
arr.splice(3, 0, 'หมื่น');
arr.splice(5, 0, 'พัน');
arr.splice(7, 0, 'ร้อย');
} else if (value === 7) {
arr.splice(1, 0, 'ล้าน');
arr.splice(3, 0, 'แสน');
arr.splice(5, 0, 'หมื่น');
arr.splice(7, 0, 'พัน');
arr.splice(9, 0, 'ร้อย');
} else {
return 'error plz check your input';
}
arr = deleteZeroText(arr);
return arr.reduce(function (a, b) {
return a + b;
});
}
function numtolang(value) {
if (value.length === 1) return THAILANG_DICT[value];
var newvalue = [];
for (var i = 0; i < value.length; i++) {
if (value[i] in THAILANG_DICT) {
newvalue[i] = THAILANG_DICT[value[i]];
} else {
return 'error check your data is it integer';
}
}
return insertThai(value.length, newvalue);
}
/**
* Converts an Integer number to Thai language.
* @example IntegerToThaiLang(112)=> 'หนึ่งร้อยสิบสอง'
* @param {string|number} number
* @returns {string} thailanguage
*/
function IntegerToThaiLang(number) {
var mtf = [[]];
var output = [];
number = number.toString();
if (number.length === 1) return numtolang(number);
if (number === '' || number === null) return 'data is null';
var value = splitText(number, ',');
if (value.length === 1) value = value[0].split('');
var MAX_LOOP = Math.ceil(value.length / 7);
if (MAX_LOOP < 1) MAX_LOOP = 1;else if (MAX_LOOP === 1) return numtolang(number);
var i;
for (i = 0; i < MAX_LOOP; i++) {
for (var j = 0; j < 6; j++) {
if (mtf[i] === undefined) mtf[i] = [];
mtf[i][j] = value[value.length - j - 1];
var index = mtf[i].indexOf(undefined);
if (index > -1) mtf[i].splice(index, 1);
}
mtf[i] = mtf[i].reduce(function (a, b) {
return b + a;
});
value = value.replace(mtf[i], '');
output[i] = numtolang(mtf[i]);
}
var str = repeatStringNumTimes('ล้าน', i - 1);
output[i - 1] = output[i - 1].concat(str);
var thailanguage = output.reduce(function (a, b) {
return b + a;
});
return thailanguage;
}
var IntegerToThaiLang_1 = IntegerToThaiLang;
/**
* Converts an Integer number to English form.
* @example IntegerToEnglish(112,'ordinal')=> '112th'
* IntegerToEnglish(112,'words')=> 'one hundred twelve'
* IntegerToEnglish(112,'wordsordinal')=> 'one hundred twelfth'
* @param {string|number} number
* @param {string} option
* @returns {string}
*/
function IntegerToEnglish(number, option) {
if (typeof number === 'string') number = parseInt(number);
if (option === '') return 'plz type option words, ordinal or wordsordinal';
switch (option) {
case 'words':
return src$1.toWords(number);
case 'ordinal':
return src$1.toOrdinal(number);
case 'wordsordinal':
return src$1.toWordsOrdinal(number);
default:
return 'plz type option words, ordinal or wordsordinal';
}
}
var IntegerToEnglish_1 = IntegerToEnglish;
var src = {
ThaiNumToInteger: ThainumToInteger_1,
ThaiNumToStringData: ThaiNumtoStringData_1,
ThaiNumToEnglish: ThaiNumToEnglish_1,
IntegerToThaiNumber: IntegerToThaiNumber_1,
IntegerToThaiLang: IntegerToThaiLang_1,
IntegerToEnglish: IntegerToEnglish_1
};
var src_1 = src.ThaiNumToInteger;
var src_2 = src.ThaiNumToStringData;
var src_3 = src.ThaiNumToEnglish;
var src_4 = src.IntegerToThaiNumber;
var src_5 = src.IntegerToThaiLang;
var src_6 = src.IntegerToEnglish;
exports.IntegerToEnglish = src_6;
exports.IntegerToThaiLang = src_5;
exports.IntegerToThaiNumber = src_4;
exports.ThaiNumToEnglish = src_3;
exports.ThaiNumToInteger = src_1;
exports.ThaiNumToStringData = src_2;
exports.default = src;
Object.defineProperty(exports, '__esModule', { value: true });
})));