Q:

Como aplicar un formato de cantidad numerica a un input

Estoy intentando hacer una función que aplique cierto formato numérico a un input. A través de un onblur se requiere una función que aplique a una cantidad que puede ser escrita de la siguiente manera "  145151,65  " pueda formatearmela de la siguiente manera  "  145.151,65  " Actualmente del lado del js tengo esto:
function formatNumber(num) {
if (num == 'Infinity') return '&#x221e;';
console.log(num);
num = num.toString().replace(/\$|\,/g, '');
console.log(num);
num = num.toString().replace('.', '');
console.log(num);
num = num.toString().replace(',', '.');
console.log(num);
//if (isNaN(num))       num = "0";
sign = (num == (num = Math.abs(num)));
num = Math.floor(num * 100 + 0.50000000001);
cents = num % 100;
if (cents < 10)
    cents = "0" + cents;
num = Math.floor(num / 100).toString();
for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3) ; i++)
    num = num.substring(0, num.length - (4 * i + 3)) + '.' + num.substring(num.length - (4 * i + 3));
return (((sign) ? '' : '-') + num );

}
Y del lado del html esto
<div class="col-md-4 form-group" style="margin-left:-30px">                                     
     <input id="input-sm" type="text" class="form-control col-sm-offset-1 numeros" ng-model="limiteSuperiorAct" id="limiteSuperiorActJD" placeholder="Limite Superior" onblur="this.value = formatNumber(this.value);">

Y el resultado que me da al escribir la cantidad cuando se activa el onblur es esto:"  14.515.165   ". Es decir que me tomo la parte decimal con si fuera un numero entero y posterior me la formateo. Si pudieran ayudarme gracias.

A:

he pensado la siguiente solución, dado que la parte "entera" ya la tienes controlada, y que la parte decimal no la tienes que modificar, puedes cortar la cadena en dos con el siguiente código:

  var comma = num.split(',')[1];
  num = num.split(',')[0];

De esta forma, tu código sólo afectaría a la parte entera. Por último, he puesto la siguiente comprobación al final, para verificar que efectivamente el número tiene parte decimal:

var result = '';
  if (comma){
    result = ((sign) ? '' : '-') + num +','+comma;
  } else {
    result = ((sign) ? '' : '-') + num;
  }
return result;

En caso de no tenerla, tu código sólo afectaría a la parte entera.
Te dejo la prueba que he usado para que lo pruebes:

function formatNumber(num) {
  var comma = num.split(',')[1];
  num = num.split(',')[0];
  console.log("Coma:"+comma);
if (num == 'Infinity') return '&#x221e;';
console.log(num);
num = num.toString().replace(/\$|\,/g, '');
console.log(num);
num = num.toString().replace('.', '');
console.log(num);
num = num.toString().replace(',', '.');
console.log(num);
//if (isNaN(num))       num = "0";
sign = (num == (num = Math.abs(num)));
num = Math.floor(num * 100 + 0.50000000001);
cents = num % 100;
if (cents < 10)
    cents = "0" + cents;
num = Math.floor(num / 100).toString();
for (var i = 0; i < Math.floor((num.length - (1 + i)) / 3) ; i++)
    num = num.substring(0, num.length - (4 * i + 3)) + '.' + num.substring(num.length - (4 * i + 3));
  var result = '';
  if (comma){
    result = ((sign) ? '' : '-') + num +','+comma;
  } else {
    result = ((sign) ? '' : '-') + num;
  }
return result;
}
<input id="input-sm" type="text" id="limiteSuperiorActJD" placeholder="Limite Superior" onblur="this.value = formatNumber(this.value);">

Espero que te sea de ayuda.
Saludos.

