تبدیل اعداد انگلیسی به فارسی/عربی یا بالعکس با جاوا اسکریپت (JS)

تبدیل اعداد انگلیسی به فارسی/عربی یا بالعکس با جاوا اسکریپت (JS)

تبدیل اعداد انگلیسی به فارسی – با کمک این آموزش می توانید اعداد انگلیسی را به فارسی یا عربی یا برعکس تبدیل کنید .
دقت داشته باشید اعداد فارسی و عربی مشابه یکدیگرند اما تفاوت هایی را هم دارند مثلا عدد 4 و 6 متفاوت است .

در این آموزش قرار است که به 2 روش اعداد را تبدیل کنیم :

  1. استفاده از کلاس Intl.NumberFormat
  2. تابعی دستی که خودمان آن را تعریف کرده و به عنوان prototype به رشته می دهیم .

روش اول Intl.NumberFormat

مشکلی این روش دارد امکان تبدیل عدد از فارسی یا عربی به انگلیسی را ندارد .

const numFa = new Intl.NumberFormat('fa-IR', {style : "decimal" }).format(987654321).replace(/٬/g , "")
const numAr = new Intl.NumberFormat('ar-AE', {style : "decimal" }).format(987654321).replace(/٬/g , "")


console.log(numFa); // ۹۸۷۶۵۴۳۲۱
console.log(numAr); // ٩٨٧٦٥٤٣٢١


روش دوم تابع دستی خودمان

در این روش علاوه بر ویژگی های روش اول می توانیم عدد فارسی یا عربی را به انگلیسی تبدیل کنیم .

String.prototype.getBaseConversionNumber = function(label){
  const faDigits = ['۱','۲','۳','۴','۵','۶','۷','۸','۹','۰'];
  const enDigits = ['1','2','3','4','5','6','7','8','9','0'];
  const arDigits = ['٠','٩','٨','٧','٦','٥','٤','٣','٢','١']
  
  var whichDigit = {};
  
  switch(label){
    case 'fa':
      whichDigit[label] = faDigits;
    break;
    case 'en':
      whichDigit[label] = enDigits;
    break; 
    case 'ar':
      whichDigit[label] = arDigits;
    break;
    case 'all':
      whichDigit = {"fa" : faDigits, "en" : enDigits, "ar" : arDigits};
    break;
    default:
      whichDigit = [];
  }
  
  return whichDigit;
}


String.prototype.CvnFromTo = function(fromDigits,toDigits,str){
  var str = str == undefined ? this : str;
  for(var i=0;i<toDigits.length;i++){
    const currentFromDigit = fromDigits[i];
    const currentToDigit = toDigits[i];
    const regex = new RegExp(currentFromDigit,'g');
    str = str.replace(regex, currentToDigit);
  }
  return str;
}

String.prototype.convertDigits = function(to){
  let str = this;
  const toCvn = (this.getBaseConversionNumber(to))[to];
  const allDigits = this.getBaseConversionNumber("all");
  
  delete allDigits[to];
  
  const Objkeys = Object.keys(allDigits);
  for(var i=0;i<Objkeys.length;i++){
    const currentKey = Objkeys[i];
    const fromCvn = allDigits[currentKey];
    str = this.CvnFromTo(fromCvn,toCvn,str)
  }
  return str;
}

const myNumber = 987654321;
const intFa = myNumber.toString().convertDigits("fa");
const intAr = myNumber.toString().convertDigits("ar");
const intUs = intFa.convertDigits("en");

console.log(intFa); // ۹۸۷۶۵۴۳۲۱
console.log(intAr); // ٩٨٧٦٥٤٣٢١
console.log(intUs); // 987654321

gist

ارسال نظر

جهت استفاده از کد حتما از تگ pre استفاده نمایید .

لیست نظرات

  1. محمود رنجبر نورآبادی
    محمود رنجبر نورآبادی

    سلام دوباره استاد باقری عزیز منظورم اون آخرین پاسخ هست که دکمه run داره من از اون استفاده کردم replace رو میدونم کارش چیه این حرف d معرف همون اعداد انگلیسی هست درسته ؟ اون فلش که بعد از حرف d هست یعنی تابعی اجرا میشه ؟ یکم راجع به این آخری راهنمایی بفرمایید زنده باد راپید کد

    12 دی 1401 | 20:28:21
  • حسین باقری
    حسین باقری

    درستش ، رپید کد هست .
    نه در اینجا d به معنای اون کاراکتر یا کلمه ای که پارامتر اول replace جهت جستجو داده می شه در نظر گرفته می شه و زمانی که ورودی دوم تابع داده بشه ورودی اول تابع میشه خود کلمه یافت شده و دومین ورودی میشه موقعیت کاراکتر (zero base) .
    مثال:

    "_abc".replace(/[abc]/gi , (match,the_offset) => `${match}(${the_offset}) `)
    که خروجی میشه
    '_a(1) b(2) c(3) '

    دلیل استفاده از جهت هم به خاطر arrow function هست که تعریف تابع به صورت مختصر تر هست
    12 دی 1401 | 23:29:52
  • محمود رنجبر نورآبادی
    محمود رنجبر نورآبادی

    سلام مهندس باقری من یه کد خیلی ساده برای این کار پیدا کردم فقط میخوام یه توضیحی در مورد نحوه کارکردش بفرمایید که چه اتفاقی میفته https://codereview.stackexchange.com/questions/166750/convert-persian-and-arabic-digits-to-english

    12 دی 1401 | 13:30:29
    • حسین باقری
      حسین باقری

      درود ، در واقع در این پرسش و پاسخی که لینکش رو فرستادید استفاده از replace که در همین مقاله استفاده شده به کار اومده اما با این تفاوت که از Unicode characters در داخل RegEx استفاده شده .
      Unicode characters ها محدود وسیعی از هرگونه کاراکتر هستند که در هر دستگاه مدرن سازگاری بدون خطا را ایفا می کنند .

      12 دی 1401 | 17:23:21
    contact us