UNPKG

price-seprator

Version:

لایبرری ساده برای جدا کردن سه رقمی قیمت و تبدیل عدد به حروف فارسی و انگلیسی

355 lines (321 loc) 9.71 kB
// 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; }