У меня есть элемент <input type='number'/>.
Я хотел бы выполнить преобразование числа, которое вводится при срабатывании события отправки. Это может быть и другое событие: я открыт для предложений, но преобразование не должно происходить, пока пользователь печатает, только когда он заканчивает ввод.
Преобразование должно быть следующим:
Например: 01002000400 будет преобразовано в 10204.
Третье правило зависит от булевой переменной first_user: если оно истинно, то все нули внутри подряд будут преобразованы в один ноль, если ложно, все нули внутри будут преобразованы в два нуля.
Вот что я пробовал:
ref.value.replace('/^0+/', '')
Чтобы также удалить конечные нули, я попробовал ^0$, но не получилось так, как я хотел: не было никакого эффекта.
И я понятия не имею, как реализовать третье правило.
Как я могу этого добиться?
^0 нацеливается только на нули в начале. Чтобы нацелить на конец, вы бы использовали 0$Пробовал и так ставить ^0$ но не получилось, а основная проблема это условие номер 3 которое я совершенно не представляю как выполнить
^0$ нацелен на ноль, который находится как в начале, так и в конце. :)
Итак, ref.value.replace(/^0+|0+$|(0)+/g, '$1')?
@WiktorStribiżew да, это очень хорошо, но, как я уже сказал, средний основан на условии, сейчас я добавил к нему уточнение.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Я думаю, ты слишком много думаешь. Чтобы заменить множество чего-либо одной версией этой вещи, вам просто нужно настроить таргетинг на одну или несколько 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)хорошо, это хорошее начало, он заменяет средние на одиночные, но если у меня есть ноль спереди или сзади, он сделает их одиночными, а не удалит их
а, ладно, нули в начале и в конце строки нужно убрать?
да, условия 1 и 2 гласят, что начало и конец всегда должны быть удалены, внутренняя часть основана на условии (для некоторых пользователей это сделает все внутренние нули одинарными, а для других пользователей они будут двойными)
@LidorEliyahuShelef Часть моего ответа с регулярным выражением заменяет все несколько нулей одним нулем. Вторая часть ответа предназначена для удаления нулей на концах.
Это не оригинальный вопрос, и я здесь не для того, чтобы писать ваше приложение для вас.
Хорошим решением будет реализовать простой алгоритм, который делает то, что вам нужно. Пример:
string.length-1), пока не найдете ненулевое число;Это должно сделать очень простой метод и будет работать лучше, чем регулярное выражение.
Для триггера onSubmit думаю подойдет. Я бы использовал onChange и просто сохранил его в скрытом поле, но я думаю, что onSubmit добьется цели
возможно, вы правы, но я ищу для него решение для регулярных выражений, я делаю небольшой проект, используя в основном регулярные выражения :)
Возможно, простым решением было бы создать функцию преобразования для запуска при отправке. Что-то вроде:
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
Как вы измените это, чтобы количество нулей внутри строки зависело от меня? (например, если я хочу одиночные нули или двойные нули?
str = str.replace(/^0*(\d+?)0*$/, (matches, p1) => { return p1.replaceAll(/([^0]+)0{2,}/g, ' $100') /* 0 {2,} означает получение 2 или более нулей, а $1 может получить совпадающее содержимое в первой скобке, исключая 0, а следующие 0 могут быть добавлены сколько угодно. Здесь я два 0, так что «100 долларов», вы можете добавить столько, сколько хотите */ })
'/^0+/', и это неправильный способ использования регулярного выражения, вы должны удалить строковые кавычки и написать свое регулярное выражение внутри косой черты / как /regex/g//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>Как вы измените это, чтобы количество нулей внутри строки зависело от меня? (например, если я хочу одиночные нули или двойные нули?
@DolevMiz, тогда вы можете ввести переменную с этим счетчиком и ввести эту переменную в свое регулярное выражение, используя квантификатор { }. Если вы не можете заставить его работать, задайте новый вопрос. Между тем, если какой-либо из этих ответов здесь удовлетворил потребности исходного вопроса, было бы неплохо пометить его как принятый.
Я заметил, что мало кто это сказал, но это часть первоначального вопроса, уточнение я добавил только потому, что некоторые его не поняли, но этот спрос был всегда... :(
Я этого не понял. Теперь я вижу раздел с пояснениями, но «если это неверно, все внутренние нули будут преобразованы в двойные нули»: означает ли это, что 101 должен измениться на 1001?
Во всяком случае, я обновил ответ тем, что я понял до сих пор. Пользователь может установить флажок, чтобы указать, что он хочет оставить 00 в середине, а не просто 0. Но только если есть по крайней мере такое количество нулей. Он не вставляет новые нули.
что ты уже испробовал?