Удалить последовательные нули из числовой строки

У меня есть элемент <input type='number'/>.

Я хотел бы выполнить преобразование числа, которое вводится при срабатывании события отправки. Это может быть и другое событие: я открыт для предложений, но преобразование не должно происходить, пока пользователь печатает, только когда он заканчивает ввод.

Преобразование должно быть следующим:

  1. Удалить все ведущие нули
  2. Удалить все конечные нули
  3. Замените все остальные последовательные нули только одним или двумя нулями (в зависимости от переменной их должно быть один или два)

Например: 01002000400 будет преобразовано в 10204.

Третье правило зависит от булевой переменной first_user: если оно истинно, то все нули внутри подряд будут преобразованы в один ноль, если ложно, все нули внутри будут преобразованы в два нуля.

Пытаться

Вот что я пробовал:

ref.value.replace('/^0+/', '')

Чтобы также удалить конечные нули, я попробовал ^0$, но не получилось так, как я хотел: не было никакого эффекта.

И я понятия не имею, как реализовать третье правило.

Как я могу этого добиться?

что ты уже испробовал?

I0_ol 31.01.2023 13:34
^0 нацеливается только на нули в начале. Чтобы нацелить на конец, вы бы использовали 0$
I0_ol 31.01.2023 13:38

Пробовал и так ставить ^0$ но не получилось, а основная проблема это условие номер 3 которое я совершенно не представляю как выполнить

Dolev Miz 31.01.2023 13:39
^0$ нацелен на ноль, который находится как в начале, так и в конце. :)
I0_ol 31.01.2023 13:40

Итак, ref.value.replace(/^0+|0+$|(0)+/g, '$1')?

Wiktor Stribiżew 31.01.2023 13:51

@WiktorStribiżew да, это очень хорошо, но, как я уже сказал, средний основан на условии, сейчас я добавил к нему уточнение.

Dolev Miz 31.01.2023 13:55
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
6
91
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я думаю, ты слишком много думаешь. Чтобы заменить множество чего-либо одной версией этой вещи, вам просто нужно настроить таргетинг на одну или несколько things и в вашей функции замены заменить на одну thing

Вам не нужно указывать начало или конец. Вам просто нужно указать любой один или несколько 0, а затем заменить на один 0

Попробуй это:

const singleZeros = '10020004'.replace(/(0+)/g, '0')

console.info(singleZeros);

Для удаления начальных и конечных 0 может быть лучший способ, но я бы сделал следующее:

const removeStart = (s) => s.startsWith('0') ? s.slice(1) : s;
const removeEnd = (s) => s.endsWith('0') ? s.slice(0, s.length - 1) : s;

const zerosOnEnds = '0102040'

const zerosTrimmed = removeEnd(removeStart(zerosOnEnds));


console.info(zerosTrimmed)

хорошо, это хорошее начало, он заменяет средние на одиночные, но если у меня есть ноль спереди или сзади, он сделает их одиночными, а не удалит их

Dolev Miz 31.01.2023 13:49

а, ладно, нули в начале и в конце строки нужно убрать?

I0_ol 31.01.2023 13:51

да, условия 1 и 2 гласят, что начало и конец всегда должны быть удалены, внутренняя часть основана на условии (для некоторых пользователей это сделает все внутренние нули одинарными, а для других пользователей они будут двойными)

Dolev Miz 31.01.2023 13:52

@LidorEliyahuShelef Часть моего ответа с регулярным выражением заменяет все несколько нулей одним нулем. Вторая часть ответа предназначена для удаления нулей на концах.

I0_ol 31.01.2023 14:10

Это не оригинальный вопрос, и я здесь не для того, чтобы писать ваше приложение для вас.

I0_ol 31.01.2023 14:14

Хорошим решением будет реализовать простой алгоритм, который делает то, что вам нужно. Пример:

  • Удаляйте с первой позиции (0) дальше, пока не найдете ненулевое число;
  • Удаляйте с последней позиции назад (string.length-1), пока не найдете ненулевое число;
  • Пройдите строку после модификации, указанной выше, и: если текущее число не равно нулю, создайте с ним новую строку, если оно равно нулю, а предыдущее не было, включите его в новую строку, если предыдущее число было равно нулю, проигнорируйте его. .

Это должно сделать очень простой метод и будет работать лучше, чем регулярное выражение. Для триггера onSubmit думаю подойдет. Я бы использовал onChange и просто сохранил его в скрытом поле, но я думаю, что onSubmit добьется цели

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

Dolev Miz 31.01.2023 13:57

Возможно, простым решением было бы создать функцию преобразования для запуска при отправке. Что-то вроде:

answer = 10020004
function transform(answer){

    final_answ = ''
    index = 0
    zero_index = -2
    while(index<answer.toString().length){
      if (answer.toString()[index] !== '0'){
        final_answ += answer.toString()[index]
      } else if (index === zero_index+1){
        zero_index = index
      } else {
        final_answ += answer.toString()[index]
        zero_index = index
      }
      index++
    }
}

Преобразование ответа пользователя в строку также позволит вам легко удалить начальный и конечный «0». Если это не поможет, не могли бы вы предоставить дополнительную информацию? Надеюсь, поможет.

Вы можете попробовать это

let str = '001002000400'
str = str.replace(/^0*(\d+?)0*$/, (matchs, p1) => { 
  return p1.replaceAll(/([^0]+)0+/g,'$10')
})
console.info(str); //10204

Как вы измените это, чтобы количество нулей внутри строки зависело от меня? (например, если я хочу одиночные нули или двойные нули?

Dolev Miz 06.02.2023 05:47

str = str.replace(/^0*(\d+?)0*$/, (matches, p1) => { return p1.replaceAll(/([^0]+)0{2,}/g, ​​' $100') /* 0 {2,} означает получение 2 или более нулей, а $1 может получить совпадающее содержимое в первой скобке, исключая 0, а следующие 0 могут быть добавлены сколько угодно. Здесь я два 0, так что «100 долларов», вы можете добавить столько, сколько хотите */ })

c arol 09.02.2023 13:20
  • из вашего поста все, что вам нужно, это просто регулярное выражение, чтобы заменить первый нуль пустой строкой и другим нулем в середине, если их больше 1, замените их и просто сохраните один
  • что вам понадобится в первую очередь в вашем коде, вы использовали регулярное выражение как строку'/^0+/', и это неправильный способ использования регулярного выражения, вы должны удалить строковые кавычки и написать свое регулярное выражение внутри косой черты / как /regex/
  • второе: вам нужно использовать модификаторы регулярных выражений в вашем случае вам нужен модификатор g
  • для получения дополнительной информации о регулярных выражениях вы можете проверить некоторые учебные пособия, такие как это , или краткий справочник, такой как ссылка w3schools
  • вот ваше регулярное выражение
//Result: 104057
console.info("0100400057".replace(/^0|(0)+(?=0)/g, ""))
Ответ принят как подходящий

Вы можете сделать это с помощью одного вызова replace. Три случая можно проверить в следующем порядке:

  • Нули в начале строки
  • Нули в конце строки
  • Нули (более одного) где-либо еще: захватите первый ноль в группе захвата

В качестве замены выведите строку, захваченную группой захвата. Поскольку эта группа фиксирует ноль только тогда, когда начинается третий случай, это практически означает, что все остальные нули удаляются.

Я считаю, что исключение из этого правила должно быть введено, когда число равно нулю. Я думаю, вы хотите сохранить этот единственный ноль. Чтобы это произошло, я бы ограничил первые два правила следующим образом:

  • Нули в начале строки, если за ними следует ненулевое значение
  • Нули в конце строки после ненулевого
  • Нули (более одного) где-либо еще: захватите первый ноль в группе захвата

Третий случай теперь также будет применяться, когда ввод состоит только из нулей.

Вы могли бы использовать событие submit, но, возможно, также интересно использовать событие change: оно не срабатывает, когда пользователь печатает, а срабатывает, когда пользователь «фиксирует» значение, т. е. когда фокус перемещается на другой элемент, или выбрана другая вкладка/окно, или элементы управления вверх/вниз используются в виджете ввода, или форма отправлена, ...

const inputDouble = document.getElementById("double")
const input = document.getElementById("inp");

document.addEventListener("change", function () {
    const regex = inputDouble.checked
          ? /^0+(?=[^0])|(?<=[^0])0+$|(00)0+/g
          : /^0+(?=[^0])|(?<=[^0])0+$|(0)0+/g
    input.value = input.value.replace(regex, "$1");
});
<input id = "double" type = "checkbox"> Double zeroes<br>
Number to clean: <input id = "inp" type = "number"><br>

<button>Fake submit</button>

Как вы измените это, чтобы количество нулей внутри строки зависело от меня? (например, если я хочу одиночные нули или двойные нули?

Dolev Miz 06.02.2023 05:49

@DolevMiz, тогда вы можете ввести переменную с этим счетчиком и ввести эту переменную в свое регулярное выражение, используя квантификатор { }. Если вы не можете заставить его работать, задайте новый вопрос. Между тем, если какой-либо из этих ответов здесь удовлетворил потребности исходного вопроса, было бы неплохо пометить его как принятый.

trincot 06.02.2023 07:22

Я заметил, что мало кто это сказал, но это часть первоначального вопроса, уточнение я добавил только потому, что некоторые его не поняли, но этот спрос был всегда... :(

Dolev Miz 06.02.2023 07:29

Я этого не понял. Теперь я вижу раздел с пояснениями, но «если это неверно, все внутренние нули будут преобразованы в двойные нули»: означает ли это, что 101 должен измениться на 1001?

trincot 06.02.2023 08:58

Во всяком случае, я обновил ответ тем, что я понял до сих пор. Пользователь может установить флажок, чтобы указать, что он хочет оставить 00 в середине, а не просто 0. Но только если есть по крайней мере такое количество нулей. Он не вставляет новые нули.

trincot 06.02.2023 09:09

Другие вопросы по теме