price-seprator
Version:
لایبرری ساده برای جدا کردن سه رقمی قیمت و تبدیل عدد به حروف فارسی و انگلیسی
355 lines (321 loc) • 9.71 kB
JavaScript
// price-separator.js
// لایبرری ساده برای جدا کردن سه رقمی قیمت و تبدیل عدد به حروف فارسی و انگلیسی
/**
* جداکننده سه رقمی اعداد (مثلاً 1234567 => 1,234,567)
* @param {number|string} price - قیمت به صورت عدد یا رشته
* @returns {string} - قیمت جدا شده با کاما
*/
function separatePrice(price) {
if (price === null || price === undefined) return "";
const str = price.toString().replace(/\D/g, "");
return str.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
/**
* تبدیل عدد به حروف فارسی + واحد پولی (پیشفرض: تومان)
* @param {number|string} price - قیمت به صورت عدد یا رشته
* @param {string} [currency="تومان"] - واحد پولی (تومان، ریال، دلار و غیره)
* @returns {string} - قیمت به حروف فارسی
*/
function priceToPersianWords(price, currency = "تومان") {
if (price === null || price === undefined || isNaN(price)) return "";
const num = parseInt(price.toString().replace(/\D/g, ""), 10);
if (num === 0) return `صفر ${currency}`;
return numberToPersian(num) + ` ${currency}`;
}
/**
* تبدیل عدد به حروف انگلیسی + واحد پولی
* @param {number|string} price - قیمت به صورت عدد یا رشته
* @param {string} [currency="USD"] - واحد پولی (USD, EUR, etc.)
* @returns {string} - قیمت به حروف انگلیسی
*/
function priceToEnglishWords(price, currency = "USD") {
if (price === null || price === undefined || isNaN(price)) return "";
const num = parseInt(price.toString().replace(/\D/g, ""), 10);
if (num === 0) return `zero ${currency}`;
return numberToEnglish(num) + ` ${currency}`;
}
// توابع کمکی برای تبدیل عدد به حروف فارسی
const yakan = ["", "یک", "دو", "سه", "چهار", "پنج", "شش", "هفت", "هشت", "نه"];
const dahgan = [
"",
"ده",
"بیست",
"سی",
"چهل",
"پنجاه",
"شصت",
"هفتاد",
"هشتاد",
"نود",
];
const sadgan = [
"",
"صد",
"دویست",
"سیصد",
"چهارصد",
"پانصد",
"ششصد",
"هفتصد",
"هشتصد",
"نهصد",
];
const dahyek = [
"ده",
"یازده",
"دوازده",
"سیزده",
"چهارده",
"پانزده",
"شانزده",
"هفده",
"هجده",
"نوزده",
];
const basex = ["", "هزار", "میلیون", "میلیارد", "تریلیون"];
// توابع کمکی برای تبدیل عدد به حروف انگلیسی
const ones = [
"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
"ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"
];
const tens = [
"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety"
];
const scales = ["", "thousand", "million", "billion", "trillion"];
function numberToPersian(num) {
if (num === 0) return "";
let str = "";
let i = 0;
while (num > 0) {
let s = num % 1000;
if (s !== 0) {
let part = threeDigitToPersian(s);
if (basex[i]) part += " " + basex[i];
str = part + (str ? " و " + str : "");
}
num = Math.floor(num / 1000);
i++;
}
return str.trim();
}
function threeDigitToPersian(num) {
let out = "";
let s = Math.floor(num / 100);
let d = Math.floor((num % 100) / 10);
let y = num % 10;
if (s) out += sadgan[s];
if (d > 1) {
if (out) out += " و ";
out += dahgan[d];
if (y) out += " و " + yakan[y];
} else if (d === 1) {
if (out) out += " و ";
out += dahyek[y];
} else if (y) {
if (out) out += " و ";
out += yakan[y];
}
return out;
}
/**
* تبدیل عدد به حروف انگلیسی
* @param {number} num - عدد ورودی
* @returns {string} - عدد به حروف انگلیسی
*/
function numberToEnglish(num) {
if (num === 0) return "zero";
let result = "";
let i = 0;
while (num > 0) {
let chunk = num % 1000;
if (chunk !== 0) {
let chunkStr = threeDigitToEnglish(chunk);
if (scales[i]) chunkStr += " " + scales[i];
result = chunkStr + (result ? " " + result : "");
}
num = Math.floor(num / 1000);
i++;
}
return result.trim();
}
function threeDigitToEnglish(num) {
if (num === 0) return "";
let result = "";
// صدگان
let hundreds = Math.floor(num / 100);
if (hundreds > 0) {
result += ones[hundreds] + " hundred";
if (num % 100 > 0) result += " and ";
}
// دهگان و یکان
let remainder = num % 100;
if (remainder > 0) {
if (remainder < 20) {
result += ones[remainder];
} else {
let tensDigit = Math.floor(remainder / 10);
let onesDigit = remainder % 10;
result += tens[tensDigit];
if (onesDigit > 0) {
result += "-" + ones[onesDigit];
}
}
}
return result;
}
/**
* تبدیل حروف فارسی به عدد
* @param {string} text - متن حاوی عدد به حروف فارسی
* @returns {number} - عدد معادل یا -1 در صورت خطا
*/
function persianWordsToNumber(text) {
if (!text || typeof text !== 'string') return -1;
// حذف واحد پولی و کلمات اضافی
text = text.replace(/تومان|ریال|دلار|یورو/g, '').trim();
text = text.replace(/و/g, ' ');
// جدول تبدیل کلمات فارسی به اعداد
const persianNumbers = {
'صفر': 0,
'یک': 1,
'دو': 2,
'سه': 3,
'چهار': 4,
'پنج': 5,
'شش': 6,
'هفت': 7,
'هشت': 8,
'نه': 9,
'ده': 10,
'یازده': 11,
'دوازده': 12,
'سیزده': 13,
'چهارده': 14,
'پانزده': 15,
'شانزده': 16,
'هفده': 17,
'هجده': 18,
'نوزده': 19,
'بیست': 20,
'سی': 30,
'چهل': 40,
'پنجاه': 50,
'شصت': 60,
'هفتاد': 70,
'هشتاد': 80,
'نود': 90,
'صد': 100,
'دویست': 200,
'سیصد': 300,
'چهارصد': 400,
'پانصد': 500,
'ششصد': 600,
'هفتصد': 700,
'هشتصد': 800,
'نهصد': 900,
'هزار': 1000,
'میلیون': 1000000,
'میلیارد': 1000000000,
'تریلیون': 1000000000000
};
const words = text.split(/\s+/);
let result = 0;
let tempSum = 0;
for (let i = 0; i < words.length; i++) {
const word = words[i].trim();
if (!word) continue;
const value = persianNumbers[word];
if (value === undefined) return -1; // کلمه نامعتبر
if (value >= 1000) {
tempSum = tempSum === 0 ? value : tempSum * value;
result += tempSum;
tempSum = 0;
} else {
tempSum += value;
}
}
return result + tempSum;
}
/**
* تبدیل حروف انگلیسی به عدد
* @param {string} text - متن حاوی عدد به حروف انگلیسی
* @returns {number} - عدد معادل یا -1 در صورت خطا
*/
function englishWordsToNumber(text) {
if (!text || typeof text !== 'string') return -1;
// حذف واحد پولی و کلمات اضافی
text = text.replace(/dollars|usd|euro|eur|pound|gbp/gi, '').trim();
text = text.replace(/and|,/gi, ' ').toLowerCase();
// جدول تبدیل کلمات انگلیسی به اعداد
const englishNumbers = {
'zero': 0,
'one': 1,
'two': 2,
'three': 3,
'four': 4,
'five': 5,
'six': 6,
'seven': 7,
'eight': 8,
'nine': 9,
'ten': 10,
'eleven': 11,
'twelve': 12,
'thirteen': 13,
'fourteen': 14,
'fifteen': 15,
'sixteen': 16,
'seventeen': 17,
'eighteen': 18,
'nineteen': 19,
'twenty': 20,
'thirty': 30,
'forty': 40,
'fifty': 50,
'sixty': 60,
'seventy': 70,
'eighty': 80,
'ninety': 90,
'hundred': 100,
'thousand': 1000,
'million': 1000000,
'billion': 1000000000,
'trillion': 1000000000000
};
// پردازش اعداد مرکب مانند twenty-one
text = text.replace(/\-/g, ' ');
const words = text.split(/\s+/);
let result = 0;
let tempSum = 0;
for (let i = 0; i < words.length; i++) {
const word = words[i].trim();
if (!word) continue;
const value = englishNumbers[word];
if (value === undefined) return -1; // کلمه نامعتبر
if (value === 100) {
tempSum = tempSum === 0 ? 100 : tempSum * 100;
} else if (value >= 1000) {
tempSum = tempSum === 0 ? value : tempSum * value;
result += tempSum;
tempSum = 0;
} else {
tempSum += value;
}
}
return result + tempSum;
}
// اکسپورت توابع برای استفاده در همه فریمورکها
if (typeof module !== "undefined" && module.exports) {
module.exports = {
separatePrice,
priceToPersianWords,
priceToEnglishWords,
persianWordsToNumber,
englishWordsToNumber
};
} else {
window.separatePrice = separatePrice;
window.priceToPersianWords = priceToPersianWords;
window.priceToEnglishWords = priceToEnglishWords;
window.persianWordsToNumber = persianWordsToNumber;
window.englishWordsToNumber = englishWordsToNumber;
}