base_ui/manuals/persianNumber.ts

381 lines
8.7 KiB
TypeScript
Raw Normal View History

2025-02-01 09:34:55 +00:00
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,
};