const formatNumber2 = (num) => {
  return parseFloat(num)
    .toFixed(2)
    .toString()
    .replace('.', ',')
    .replace(/\B(?=(\d{3})+(?!\d))/g, ".");
};

Aquí está lo que hace cada parte de la función:

  1. parseFloat(num): Convierte el parámetro num a un número de punto flotante. Esto asegura que el número se trate como un número y no como una cadena de texto.
  2. .toFixed(2): Redondea el número a 2 decimales.
  3. .toString(): Convierte el número redondeado a una cadena de texto.
  4. .replace('.', ','): Reemplaza el punto decimal por una coma, lo que da formato al número como un número decimal con coma.
  5. .replace(/\B(?=(\d{3})+(?!\d))/g, "."): Esta es una expresión regular que agrega puntos de miles al número. Aquí está lo que hace:
    • /\B(?=(\d{3})+(?!\d))/g: Esta es la expresión regular. Busca todos los lugares donde hay un dígito que no está seguido de otros 3 dígitos.
    • ".": Reemplaza esos lugares con un punto.

En resumen, esta función toma un número, lo convierte a un número de punto flotante con 2 decimales, y luego le da formato con comas y puntos de miles, como se esperaría en una representación numérica estándar.