Aquí hay dos forro rápida que commafies números:
function commafy(inVal){
var ary = String(inVal).match(/(\d{0,2})((?:\d{3})*)([^\d].*$)/i);
return (ary[1] == "" ? [] : [ary[1]]).splice(1, 0, ary[2].match(/[0-9]{3}/g)).join(",") + ary[3];
}
si se extendían, que podría tener este aspecto:
function commafy(inVal){
var aryChunks = [];
var inVal = String(inVal);
var aryPart1 = inVal.match(/(\d{0,2})((?:\d{3})*)([^\d].*$)/i);
if(aryPart1[1] != ""){
aryChunks.push(aryPart1[1]);
}
var aryPart2 = aryPart1[2].match(/[0-9]{3}/g);
aryChunks.splice(1, 0, aryPart2);
var outVal = aryChunks.join(",");
outVal += aryPart1[3];
return outVal;
}
En primer lugar, aryPart1 se asigna con un partido de expresiones regulares que consta de [0 a 2 números], seguido de [cadena de caracteres cuya longitud es un múltiplo de 3], y luego [cero o uno sin dígitos y todo lo demás].
Luego, si no es "", agregamos los [0 a 2 números] a aryChunks.
Después de eso, tomamos la [cadena de caracteres cuya longitud es múltiplo de 3] y la regex los combina en una matriz de [3 caracteres] llamada aryPart2, que luego empalmamos con aryChunks.
Ahora aryChunks contiene los trozos que uniremos con una coma y asignaremos a outVal.
Todo lo que queda por hacer es agregar el [cero o uno que no sea un dígito y todo lo demás] a outVal, y devolver outVal a la persona que llama.
Según el OP, {0,2} y {3} en la expresión regular 1 y {3} en la expresión regular 2 pueden ser variables para hacer que los fragmentos tengan cualquier longitud, y \ d en las expresiones regulares se puede cambiar a "." si quieres que funcione en más que solo números.
Pasé demasiado tiempo escribiendo esto, por lo que podría haber un par de problemas técnicos. Apúntalos y los modificaré.
+1 agradable y en la captura '{1,3}' :) – alex
Esta es, técnicamente, la mejor respuesta, ya que tomará todo el texto de una cadena que no es divisible por 3 (captará los últimos 2 o 1 caracteres) – Erik
Use '[\ s \ S]' en lugar de '.' para no fallar en las nuevas líneas. –