Вставьте «-» между каждые 6 символов

#javascript #php #html

Вопрос:

Я пытаюсь отформатировать текст ввода, разделив 48 чисел на блоки по 6 чисел, например:

 00000000000000000000000000000000000000000000 
 

становится

 000000-000000-000000-000000-000000-000000-000000-000000
 

Эти номера возвращаются с ответом $после отправки формы с CURL.

По какой-то причине, когда результат возвращает его не в этом формате, мне нужно стереть номер и переписать его так, чтобы он был исправлен и в правильном формате.

Это код, который я использую:

JS

 $(window).on("load",
    function () {
        $("#resID").on("change paste input", function (e) {
            var t = this.value.replace(/D/g, "");
            48 == t.length ? (this.value = t.match(new RegExp(".{1,"   t.length / 6   "}", "g")).join("-")) : (this.value = t)
        });
    });
 

HTML

 <div class="response">
   <?php if($response != ''){ ?>
    <input type="search" class="form-control" id="resID" style="text-align: center;" value="<?php echo $response; ?>" data-clipboard-target="#resID" href="#" readonly>
    <?php } ?>
</div>
 

Короче говоря, он правильно форматируется, но мне нужно обновить числа, удалив последнее и введя его снова.

Кто-нибудь знает, что может быть не так?

Комментарии:

1. Не используйте троичный вместо if оператора, это затрудняет чтение кода.

2. Вместо значения следует использовать троичный, например this.value = <condition> ? expression1 : expression2;

3. Есть ли причина, по которой вы не исправляете это в PHP?

4. Можете ли вы показать пример числа, которое вам нужно исправить в формате?

5. Тривиально делать и в PHP — просто нужна комбинация str_split и implode , 3v4l.org/icIBU

Ответ №1:

Это можно сделать в одну строку. Мы можем использовать String.prototype.match() для разделения строки на массив сегментов из 6 символов и Array.prototype.join() объединения этих частей вместе.

 var value = '000000000000000000000000000000000000000000000000';
console.log(value.match(/.{1,6}/g).join("-")) 

В вашем случае:

 $(window).on('load', () => {
  $("#resID").on("change paste input", function(e) {
    this.value = this.value.match(/.{1,6}/g).join("-");
  })
})




/* below for demonstration purposes only */
setTimeout(() => {
  console.log('set value to 000000000000000000000000000000000000000000000000');
  $('#resID').val('000000000000000000000000000000000000000000000000').trigger('change');
}, 1000); 
 input {
  width: 415px;
} 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<input type="search" class="form-control" id="resID" style="text-align: center;" value="" data-clipboard-target="#resID" href="#" readonly> 

Комментарии:

1. Это действительно хороший ответ!

2. Похоже, проблема спрашивающего в том, что их код для форматирования строки находится внутри $("#resID").on("change paste input", function (e) { .

3. краткий ответ нам нужно больше от вас на SO. @Spectric

4. @Джоундилл Спасибо за напоминание. Я обновил свой ответ 🙂

5. Эй, друзья, большое вам спасибо за помощь, мне удалось решить проблему с вашей помощью.

Ответ №2:

Используя подстроку в цикле for, вы можете использовать индекс для создания делимого раздела index, index 6 , затем поместить его в массив, чтобы получить части, которые можно соединить с помощью тире.

 let string = "000000000000000000000000000000000000000000000000";

function addDashes(string) {
  let strArr = []
  for (let i = 0, len = string.length; i < len; i  = 6) {
    strArr.push(string.substring(i, i   6));
  }
  return strArr.join('-')
}

console.log(addDashes(string)) 

Комментарии:

1. Привет, друг, большое тебе спасибо за твою помощь.