разделяйте тысячи во время набора текста на фарси (персидском) - PullRequest
0 голосов
/ 13 мая 2018

Я использую этот фрагмент, чтобы разделить тысячи внутри поля ввода, пока пользователь печатает. он работает правильно с английскими буквами, но не отвечает на фарси (персидские). Есть ли способ сделать его совместимым?

$('input.number').keyup(function(event) {

  // skip for arrow keys
  if (event.which >= 37 && event.which <= 40) return;

  // format number
  $(this).val(function(index, value) {
    return value
      .replace(/\D/g, "")
      .replace(/\B(?=(\d{3})+(?!\d))/g, ",");
  });
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input class="form-control number" type="text" value="0" name="subjectvalue" id="txt_subjectvalue">

Ответы [ 2 ]

0 голосов
/ 13 мая 2018

Этот код будет захватывать любое значение, которое элемент input в настоящее время имеет, удаляет все символы , и . и преобразует String в Число , используя toLocaleString () , который принимает язык параметр:

// listens to an "input" event on the <input> element
document.querySelectorAll('input')[0].addEventListener('input', onInput_Arabic);
document.querySelectorAll('input')[1].addEventListener('input', onInput_normal);

function onInput_normal(){
   // convert into a Number & cleanup the input's value 
   var v = +(this.value.replace(/[,|\.|\D]/g,''));
   // replace the input's value with the formatted wanted value
   this.value =  this.value ? v.toLocaleString() : '';
}

function onInput_Arabic(){
   // convert into a Number & cleanup the input's value 
   // var v = +(this.value.replace(/[,|\.|\D]/g,''));
   var v = transformNumbers.toEnglish( this.value );
   // replace the input's value with the formatted wanted value
   this.value =  this.value ? (+v).toLocaleString('ar-EG') : '';
}

// transforms Numerals from one language system to another
var transformNumbers = (function(){
    var numerals = {
        persian : ["۰", "۱", "۲", "۳", "۴", "۵", "۶", "۷", "۸", "۹"],
        arabic  : ["٠", "١", "٢", "٣", "٤", "٥", "٦", "٧", "٨", "٩"]
    };

    function fromEnglish(str, lang){
        var i, len = str.length, result = "";

        for( i = 0; i < len; i++ )
            result += numerals[lang][str[i]]; 

        return result;
    }

    return {
        toEnglish : function(str){
            var num, i, len = str.length, result = "";

            for( i = 0; i < len; i++ ){
                num = numerals["persian"].indexOf(str[i]);
                num = num != -1 ? num : numerals["arabic"].indexOf(str[i]);
                if( num == -1 ) continue // num = str[i];
                result += num; 
            }
              
            return result;
        },

        toPersian : function(str, lang){
            return fromEnglish(str, "persian");
        },

        toArabic : function(str){
            return fromEnglish(str, "arabic");
        }
    }
})();
input{ width:90%; display:block; padding:5px; margin:1em 0; }
<input placeholder='Type Number in Eastern-Arabic (٢٤٦٦٩٢٤٦٦٩)'>

<input placeholder='Type Number in common language (123456) '>

Проверьте мой другой ответ о том, как преобразовать строку String в строку, разделенную «тысячами», ио разрешении ввода только чисел см. этот ответ .

0 голосов
/ 13 мая 2018

Вы можете использовать что-то вроде Cleave.js для форматирования ввода.

Обновление:

Есть много библиотек и плагинов для этого. даже вы можете сделать это с чистым JS, вот ответ, который может помочь вам .

Как настроение упоминалось в его ответе, вы можете использовать метод replace(), чтобы сделать это, как показано ниже:

var fnf = document.getElementById("formattedNumberField");
fnf.addEventListener('keyup', function(evt){
    var n = parseInt(this.value.replace(/\D/g,''),10);
    fnf.value = n.toLocaleString();
}, false);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...