Tengo algunos problemas para crear la máscara para el campo de moneda.
1- Necesito limitar HASTA 18 caracteres (contando el '.' y el ',') Ej: 999.999.999.999,99
2 - Necesito que pongas más de un '.' (actualmente solo uno)
3 - Necesito que esto no suceda:
Porque cuando escribo agrega el '.' justo en ese momento antes de escribir un número más.
Mi código:
function onlyNumberAmount(input) { var v = input.value; v = v + ''; v = parseInt(v.replace(/[\D]+/g, '')); v = v + ''; v = v.replace(/([0-9]{2})$/g, ",$1"); v = v.replace(/([0-9]{3}),([0-9]{2}$)/g, ".$1,$2"); input.value = v; if(v == 'NaN') input.value = ''; } <input type="text" class="form-control" id="mP0" onkeyup="onlyNumberAmount(this)">Lo siguiente parece cumplir con sus requisitos.
function onlyNumberAmount(input) { let v = input.value.replace(/\D+/g, ''); if (v.length > 14) v = v.slice(0, 14); input.value = v.replace(/(\d)(\d\d)$/, "$1,$2") .replace(/(^\d{1,3}|\d{3})(?=(?:\d{3})+(?:,|$))/g, '$1.'); } <input type="text" class="form-control" id="mP0" onkeyup="onlyNumberAmount(this)"> \d es la abreviatura de [0-9] , como estoy seguro de que sabes.
Se utiliza una anticipación positiva (?=(?:\d{3})+(?:,|$)) para garantizar la ubicación correcta del archivo .
14 es el número máximo de dígitos que pueden aparecer en la cadena.
Más explicaciones bajo petición.
Si, prueba si el campo ya es válido
const moneyTest = /(\d{1,3}\.)?(\d{1,3}\.)?(\d{1,3})?(.\d{1,2})?/ if (!moneyTest.test(field)) {Luego, si no es así, sepárelos en los campos numéricos
var digits = /d/g.match(field); // might be field.match(/d/g)Ahora tienes que ver si había un lugar decimal en el número original
var dot = field.lastIndexOf(".");Y entonces deberías ser bueno para reconstruir el número.
Pregunta: ¿Qué sucede si hay dos puntos?