Je veux utiliser regex pour formater un nombre à l'intérieur d'une entrée lorsque je le tape.
Mon problème est le suivant: comme j'utilise des groupes pour formater le nombre, il ne formate que lorsque la chaîne correspond à l'expression régulière .
Le numéro complet est le suivant: 12312312312
| Le formaté ressemblerait à ceci: 123.123.123-12
.
Si je tape 1231231
par exemple, il ne formate pas en 123.123.1
comme je le pensais, uniquement si je tape le nombre entier.
Ceci est ma fonction:
format(value){
// This function returns the formatted string on user input
return value.replace(/(\d{3})(\d{3})(\d{3})(\d+)/, "\$1.\$2.\$3-\$4");
}
Existe-t-il un moyen de rendre les optionnels des groupes restants?
Vous pouvez le faire en utilisant
function formatStr(str){
str = str.replace(/(\d{1,3})(\d{0,3})(\d{0,3})(\d{0,2})/g, function(a, b, c, d, e){
let ret = "";
if(b != "")
ret = b;
if(c != "")
ret = ret+"." + c;
if(d != "")
ret = ret+"." + d;
if(e != "")
ret = ret+"-" + e;
return ret;
})
console.log(str);
}
formatStr('12312312312');
formatStr('1231231');
Vous pouvez utiliser cette fonction format
avec 2 appels à .replace
:
Code:
function format(value) {
// This function returns the formatted string on user input
return value.replace(/(\d{3})/g, '$1.')
.replace(/((?:\d{3}\.){2}\d{3})\./, '$1-');
}
console.log(format('1231231')); //=> 123.123.1
console.log(format('12312312312')); //=> 123.123.123-12