const oneDigit = [ "صفر", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه", ]; const twoDigits = { 10: "ده", 11: "یازده", 12: "دوازده", 13: "سیزده", 14: "چهارده", 15: "پانزده", 16: "شانزده", 17: "هفده", 18: "هجده", 19: "نوزده", 20: "بیست", 30: "سی", 40: "چهل", 50: "پنجاه", 60: "شصت", 70: "هفتاد", 80: "هشتاد", 90: "نود", }; const threeDigits = { 100: "صد", 200: "دویست", 300: "سیصد", 400: "چهارصد", 500: "پانصد", 600: "شش صد", 700: "هفت صد", 800: "هشت صد", 900: "نه صد", }; const types = ["تلیارد", "میلیارد", "میلیون", "هزار", ""]; const decimalTypes = ["دهم", "صدم", "هزارم", "ده هزارم"]; let numbers = []; let decimals = []; //Convert Number To Words const convert = (number) => { let negative = ""; let decNumber = ""; let decimal = ""; let percent = ""; if (isPercent(number)) { number = number.replace("%", ""); percent = " درصد"; } number = getString(number); if (number == "") return ""; sliceNumber(number); if (isNegative(number)) negative = "منفی "; number = number.replace("-", ""); if (isDecimal(number)) { let index = number.indexOf("."); let decNumberStr = ""; decNumber = number.substr(index + 1, number.length); number = number.substr(0, index); decNumberStr = parseInt(decNumber).toString(); if (decNumberStr.length === 1 && decNumberStr != "0") { decimal += oneDigit[decNumberStr] + " "; decimal += decimalTypes[decNumber.length - 1]; } else { decimal = calculateDigits(decimals); decimal += " " + decimalTypes[decNumber.length - 1]; } } if (number.length === 1) { if (!decimal) { return negative + oneDigit[number] + percent; } if (number == "0") { return negative + decimal + percent; } return negative + oneDigit[number] + " ممیز " + decimal + percent; } if (!decimal) { return negative + calculateDigits(numbers) + percent; } return negative + calculateDigits(numbers) + " ممیز " + decimal + percent; }; //split number 3 by 3 with a separator (123456789.3025=>123,456,789.3,025) Do Not Give It Persian Numbers const sliceNumber = (number, separator = ",") => { let percent = ""; let neg = ""; let dNum = ""; let n = ""; let d = ""; if (isPercent(number)) { number = number.replace("%", ""); percent = "%"; } number = getString(number); if (number == "") return ""; if (isNegative(number)) neg = "-"; number = number.replace("-", ""); if (isDecimal(number)) { let index = number.indexOf("."); dNum = number.substr(index + 1, number.length); number = number.substr(0, index); } n = putSeparator(number, separator); numbers = n.split(separator); if (!dNum) return neg + n + percent; d = putSeparator(dNum, separator); decimals = d.split(separator); return neg + n + "." + d + percent; }; //Puts a separator between the chunks of the given numString. const putSeparator = (numString, separator = ",") => { if (typeof numString !== "string") return ""; if (numString.length < 4) return numString; let result = ""; for (let i = numString.length - 1, counter = 0; i >= 0; i--) { if (counter == 3) { result += separator; counter = 0; } result += numString[i]; counter++; } result = result.split("").reverse().join(""); return result; }; //Processing on Digits of A Number const calculateDigits = (arrNum) => { let result = ""; for (let i = 0; i < arrNum.length; i++) { let parsedNum = parseInt(arrNum[i]); let number = parsedNum; let sadgan = Math.floor(number / 100) * 100; number = number % 100; let dahgan = Math.floor(number / 10) * 10; let yekan = number % 10; result += i !== 0 && parsedNum ? " و " : ""; result += getPersian(sadgan, dahgan, yekan, i, arrNum) + " " + getType(i, arrNum); } return result.trim(); }; //Main Process That Turn a Number Into a String(122=>100+20+2) const getPersian = (sadgan, dahgan, yekan, index, numbers) => { let flag = false; let result = ""; let dahganPlusYekan = dahgan + yekan; if (threeDigits[sadgan]) { result += yekan > 0 || dahgan > 0 ? threeDigits[sadgan] + " و " : threeDigits[sadgan]; } if (twoDigits[dahganPlusYekan]) { result += twoDigits[dahganPlusYekan] + " "; return result; } if (twoDigits[dahgan]) { result += twoDigits[dahgan] + " و "; } if ( numbers.length === 2 && index === 0 && yekan === 1 && dahgan === 0 && sadgan === 0 ) { return result; } if ( numbers.length > 2 && index === numbers.length - 2 && yekan === 1 && dahgan === 0 && sadgan === 0 ) { return result; } if (yekan > 0) result += oneDigit[yekan] + " "; return result; }; //getting The Type Of Each Number (Billion, Million,...) const getType = (i, numbers) => { let parsedNum = parseInt(numbers[i]); if (isNaN(parsedNum)) return ""; if (!parsedNum) return ""; let length = numbers.length - i; let index = types.length - length; return types[index]; }; //Calculate if number:String is Negative Or Not const isNegative = (number) => { number = getString(number); if (!number) return false; if (number[0] != "-") return false; number = number.replace("-", ""); return number != "0"; }; //Calculate if number:String has '%' as Percent const isPercent = (string) => { if (typeof string !== "string") return false; let index = string.indexOf("%"); let lIndex = string.lastIndexOf("%"); if (index != lIndex) return false; return index > 0; }; //is number:String:Number is a Valid Number? if type is Number turn it to String And Return it const getString = (number) => { if (number === undefined) return ""; if (number === null) return ""; if (isNaN(number)) return ""; if (typeof number === "number") return number.toString(); return number.trim(); }; //Calculate if number:String has Decimal Point Or Not const isDecimal = (number) => { number = getString(number); if (number == "") return false; let index = number.indexOf("."); let lIndex = number.lastIndexOf("."); if (index != lIndex) return false; return index > 0; }; //Convert English Numbers To Persian Numbers const convertEnToPe = (number) => { if (number == null || number == undefined) return ""; if (typeof number == "number") number = number.toString(); let res = ""; for (let i = 0; i < number.length; i++) { switch (number[i]) { case "\u0030": res += "\u06F0"; break; case "\u0031": res += "\u06F1"; break; case "\u0032": res += "\u06F2"; break; case "\u0033": res += "\u06F3"; break; case "\u0034": res += "\u06F4"; break; case "\u0035": res += "\u06F5"; break; case "\u0036": res += "\u06F6"; break; case "\u0037": res += "\u06F7"; break; case "\u0038": res += "\u06F8"; break; case "\u0039": res += "\u06F9"; break; default: res += number[i]; } } return res; }; //Convert Persian Numbers To English Numbers const convertPeToEn = (number) => { if (number == null || number == undefined) return ""; let res = ""; for (let i = 0; i < number.length; i++) { switch (number[i]) { case "\u06F0": res += "\u0030"; break; case "\u06F1": res += "\u0031"; break; case "\u06F2": res += "\u0032"; break; case "\u06F3": res += "\u0033"; break; case "\u06F4": res += "\u0034"; break; case "\u06F5": res += "\u0035"; break; case "\u06F6": res += "\u0036"; break; case "\u06F7": res += "\u0037"; break; case "\u06F8": res += "\u0038"; break; case "\u06F9": res += "\u0039"; break; default: res += number[i]; } } return res; }; const e2p = (s) => s.replace(/\d/g, (d) => "۰۱۲۳۴۵۶۷۸۹"[d]); const e2a = (s) => s.replace(/\d/g, (d) => "٠١٢٣٤٥٦٧٨٩"[d]); const p2e = (s) => s.replace(/[۰-۹]/g, (d) => "۰۱۲۳۴۵۶۷۸۹".indexOf(d)); const a2e = (s) => s.replace(/[٠-٩]/g, (d) => "٠١٢٣٤٥٦٧٨٩".indexOf(d)); const p2a = (s) => s.replace(/[۰-۹]/g, (d) => "٠١٢٣٤٥٦٧٨٩"["۰۱۲۳۴۵۶۷۸۹".indexOf(d)]); const a2p = (s) => s.replace(/[٠-٩]/g, (d) => "۰۱۲۳۴۵۶۷۸۹"["٠١٢٣٤٥٦٧٨٩".indexOf(d)]); export { convert, sliceNumber, convertEnToPe, convertPeToEn, e2p, e2a, p2e, a2e, p2a, a2p, };