Ejemplo:
si el valor de entrada principal es "1+23+", entonces necesito reemplazar el último carácter especial por uno nuevo, supongamos que hago clic en nuevos caracteres especiales como menos, multiplicación y símbolo de división, etc.
mi salida esperada:
<body> <input type="text" id="Main"> <input class="ip" type="button" value="1" onclick="Cal(this)"> <input class="ip" type="button" value="2" onclick="Cal(this)"> <input class="ip" type="button" value="3" onclick="Cal(this)"> <input class="ip" type="button" value="+" onclick="Cal(this)"> <input class="ip" type="button" value="-" onclick="Cal(this)"> <input class="ip" type="button" value="*" onclick="Cal(this)"> </body> <script> function Cal(btn) { document.getElementById("Main").value+=btn.value; } </script>Esto es lo que quieres. Primero pruebo el último carácter de la cadena de entrada con una expresión regular que detecta caracteres especiales, y si hay un carácter especial dentro de la entrada y si el valor del botón que presionó también es un carácter especial, elimino el último carácter de la cuerda. Y luego, al final, el valor del botón que presionó se agrega al final de la cadena.
function cal(btn) { let format = /[ `!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?~]/; let input = document.getElementById("Main").value if(format.test(input.charAt(input.length - 1)) && format.test(btn.value)){ input = input.slice(0, -1) } input += btn.value; document.getElementById("Main").value = input } <body> <input type="text" id="Main"> <input class="ip" type="button" value="1" onclick="cal(this)"> <input class="ip" type="button" value="2" onclick="cal(this)"> <input class="ip" type="button" value="3" onclick="cal(this)"> <input class="ip" type="button" value="+" onclick="cal(this)"> <input class="ip" type="button" value="-" onclick="cal(this)"> <input class="ip" type="button" value="*" onclick="cal(this)"> </body>Puede editar la expresión regular para satisfacer sus necesidades exactas.
1) Si last value no es un number , es decir, es un symbol y current value tampoco not a number . En resumen, si last value es un symbol y current value también es un símbolo. En este caso, debe eliminar el last value y append el current value
const display = document.getElementById("Main"); const appendValue = val => display.value += val; const isNumber = n => !isNaN(parseInt(n)); function Cal(btn) { const lastValue = display.value.slice(-1); const currentValue = btn.value; if (!isNumber(lastValue) && !isNumber(currentValue)) display.value = display.value.slice(0, display.value.length - 1) + currentValue; else appendValue(currentValue); } <input type="text" id="Main"> <input class="ip" type="button" value="1" onclick="Cal(this)"> <input class="ip" type="button" value="2" onclick="Cal(this)"> <input class="ip" type="button" value="3" onclick="Cal(this)"> <input class="ip" type="button" value="+" onclick="Cal(this)"> <input class="ip" type="button" value="-" onclick="Cal(this)"> <input class="ip" type="button" value="*" onclick="Cal(this)">2) Solo tiene que agregar valor, si es uno de los siguientes:
number .last value es un number .last value no es un number y current value es un number const display = document.getElementById("Main"); const appendValue = val => display.value += val; const isNumber = n => !isNaN(parseInt(n)); function Cal(btn) { const lastValue = display.value.slice(-1); const currentValue = btn.value; if ((!lastValue && isNumber(currentValue)) || (isNumber(lastValue)) || (!isNumber(lastValue) && isNumber(currentValue))) appendValue(currentValue); else display.value = display.value.slice(0, display.value.length - 1) + currentValue; } <input type="text" id="Main"> <input class="ip" type="button" value="1" onclick="Cal(this)"> <input class="ip" type="button" value="2" onclick="Cal(this)"> <input class="ip" type="button" value="3" onclick="Cal(this)"> <input class="ip" type="button" value="+" onclick="Cal(this)"> <input class="ip" type="button" value="-" onclick="Cal(this)"> <input class="ip" type="button" value="*" onclick="Cal(this)">