Как конвертировать число Араби c в английский sh во входном номере? - PullRequest
1 голос
/ 28 февраля 2020

У меня есть номер типа ввода и мне нужно преобразовать числа из арабского c в английский sh, когда пользователь пытается написать:

Мой неправильный выход:

<input type="number" class="arabicNumbers">

Jquery (js) код:

function toEnglishNumber(strNum) {

   var ar = [
       '٠','١','٢','٣','٤','٥','٦','٧','٨','٩',' ','-','/','|','~','٫'
   ];

   var en = [
       '0','1','2','3','4','5','6','7','8','9','','','','','','.'
   ];

   var cache = strNum;

   for (var i = 0; i < 10; i++) {
       var regex_ar = new RegExp(ar[i], 'g');
       cache = cache.replace(regex_ar, en[i]);
   }
   return cache;
}

$(document).on('keyup', '.arabicNumbers', function() {

   toEnglishNumber($(this).val())

});

Есть предложения или нет?

Ответы [ 4 ]

1 голос
/ 28 февраля 2020

Ваш алгоритм замены сам по себе работает. (Хотя есть более элегантные способы, как вы можете видеть в разных ответах здесь).

Но у вас есть 2 проблемы:

1 - вы берете значение ввода клавишей вверх, но так как вы вводите значение type="number" - буквы арабского c просто не были добавлены к входному значению, и вам нечего заменить. поэтому вы должны принять type="text" и затем удалить все нечисловые c буквы (в том же кадре с заменой араби c)

(Вы также можете обрабатывать события keyDown и preventDefault, если event.key не содержит символов sh или numreri c, но в этом случае у вас будет проблема с ctrl+v, которая будет отклонена)

2 - вы возвращаете замену, но вы не ставите его в качестве входного значения. Вы должны сделать ..

function toEnglishNumber(strNum) {
   var ar = '٠١٢٣٤٥٦٧٨٩'.split('');
   var en = '0123456789'.split('');
   strNum = strNum.replace(/[٠١٢٣٤٥٦٧٨٩]/g, x => en[ar.indexOf(x)]);
   strNum = strNum.replace(/[^\d]/g, '');
   return strNum;
}

$(document).on('keyup', '.arabicNumbers', function(e) {
   var val = toEnglishNumber($(this).val())
   $(this).val(val)
});
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="text" class="arabicNumbers"/>
1 голос
/ 28 февраля 2020

Я не совсем уверен насчет назначения дополнительных (не числовых c) символов в вашем словаре, однако расширить следующие логики c для произвольного словаря не сложно:

const ar = [...'٠١٢٣٤٥٦٧٨٩'],
      en = [...'0123456789'],
      arToEn = s => s.replace(new RegExp(`[${ar.join('')}]`,'g'), m => en[ar.indexOf(m)])
      
console.log(arToEn('٢٣٤٥'))
1 голос
/ 28 февраля 2020

Вы можете сделать это, используя символы Юникода и шестнадцатеричные смещения, например:

function toEnglishNumber(x) {
  return x.replace(/[\u0660-\u0669\u06f0-\u06f9]/g, c => c.charCodeAt(0) & 0xf);
}
console.log(toEnglishNumber('٠١٢٣٤٥٦٧٨٩'));
1 голос
/ 28 февраля 2020

function replaceBulk( str, findArray, replaceArray ){
      var i, regex = [], map = {}; 
      for( i=0; i<findArray.length; i++ ){ 
        regex.push( findArray[i].replace(/([-[\]{}()*+?.\\^$|#,])/g,'\\$1') );
        map[findArray[i]] = replaceArray[i]; 
      }
      regex = regex.join('|');
      str = str.replace( new RegExp( regex, 'g' ), function(matched){
        return map[matched];
      });
      return str;
    }

    // Test:
    console.log( replaceBulk( "٦١", [
       '٠','١','٢','٣','٤','٥','٦','٧','٨','٩',' ','-','/','|','~','٫'
   ], [
       '0','1','2','3','4','5','6','7','8','9','','','','','','.'
   ] ) );

Ссылка: Замена нескольких строк одновременно

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...