w3schools tag tab style change attribute javascript regex math numbers

javascript - tag - title html w3schools



Eliminar los ceros finales insignificantes de un nĂºmero? (9)

¿Qué tal si multiplicamos por uno así?

var x = 1.234000*1; // becomes 1.234 var y = 1.234001*1; // stays as 1.234001

¿Me he perdido una llamada API estándar que elimina los ceros insignificantes finales de un número?

Ex.

var x = 1.234000 // to become 1.234; var y = 1.234001; // stays 1.234001

Number.toFixed () y Number.toPrecision () no son exactamente lo que estoy buscando.


Aquí hay una posible solución:

var x = 1.234000 // to become 1.234; var y = 1.234001; // stays 1.234001 eval(x) --> 1.234 eval(y) --> 1.234001


Básicamente, tenía el mismo requisito y descubrí que no hay un mecanismo incorporado para esta funcionalidad.

Además de recortar los ceros finales, también tengo la necesidad de redondear y, opcionalmente, formatear la salida para la configuración regional actual del usuario (es decir, 123,456.789).

Todo mi trabajo en esto se ha incluido como prettyFloat.js (MIT Licensed) en GitHub: https://github.com/dperish/prettyFloat.js

Ejemplos de uso:

prettyFloat(1.111001, 3) // "1.111" prettyFloat(1.111001, 4) // "1.111" prettyFloat(1.1111001, 5) // "1.1111" prettyFloat(1234.5678, 2) // "1234.57" prettyFloat(1234.5678, 2, true) // "1,234.57" (en-us)


El método toFixed hará el redondeo apropiado si es necesario. También agregará ceros finales, lo que no siempre es ideal.

(4.55555).toFixed(2); //-> "4.56" (4).toFixed(2); //-> "4.00"

Si arroja el valor de retorno a un número, esos ceros finales se descartarán. Este es un enfoque más simple que hacer su propia matemática de redondeo o truncamiento.

+(4.55555).toFixed(2); //-> 4.56 +(4).toFixed(2); //-> 4


Necesitaba resolver este problema también cuando Django estaba mostrando valores de tipo Decimal en un campo de texto. Por ejemplo, cuando ''1'' era el valor. Mostraría ''1.00000000''. Si ''1.23'' fuera el valor, mostraría ''1.23000000'' (En el caso de una configuración ''decimal_places'' de 8)

Usar parseFloat no era una opción para mí, ya que es posible que no devuelva exactamente el mismo valor. toFixed no era una opción porque no quería redondear nada, así que creé una función:

function removeTrailingZeros(value) { value = value.toString(); # if not containing a dot, we do not need to do anything if (value.indexOf(''.'') === -1) { return value; } # as long as the last character is a 0 or a dot, remove it while((value.slice(-1) === ''0'' || value.slice(-1) === ''.'') && value.indexOf(''.'') !== -1) { value = value.substr(0, value.length - 1); } return value; }


Ninguna de estas soluciones funcionó para mí para números muy pequeños. http://numeraljs.com/ resolvió esto para mí.

parseFloat(0.00000001.toFixed(8)); // 1e-8 numeral(0.00000001).format(''0[.][00000000]''); // "0.00000001"


Primero usé una combinación de matti-lyra y las respuestas de gary:

r=(+n).toFixed(4).replace(//.0+$/,'''')

Resultados:

  • 1234870.98762341: "1234870.9876"
  • 1230009100: "1230009100"
  • 0.0012234: "0.0012"
  • 0.1200234: "0.12"
  • 0.000001231: "0"
  • 0.10001: "0.1000"
  • "asdf": "NaN" (entonces no hay error de tiempo de ejecución)

El caso algo problemático es 0.10001. Terminé usando esta versión más larga:

r = (+n).toFixed(4); if (r.match(//./)) { r = r.replace(//.?0+$/, ''''); }

  • 1234870.98762341: "1234870.9876"
  • 1230009100: "1230009100"
  • 0.0012234: "0.0012"
  • 0.1200234: "0.12"
  • 0.000001231: "0"
  • 0.10001: "0.1"
  • "asdf": "NaN" (entonces no hay error de tiempo de ejecución)

Actualización : Y esta es la versión más nueva de Gary (ver comentarios):

r=(+n).toFixed(4).replace(/([0-9]+(/.[0-9]+[1-9])?)(/.?0+$)/,''$1'')

Esto da los mismos resultados que arriba.


Si lo convierte en una cadena, no mostrará los ceros al final, que no se almacenan en la variable en primer lugar desde que se creó como un Número, no como una Cadena.

var n = 1.245000 var noZeroes = n.toString() // "1.245"


Tuve una instancia similar en la que quería usar .toFixed() cuando era necesario, pero no quería el relleno cuando no lo era. Así que terminé usando parseFloat junto con to Fixed.

ajustado sin relleno

parseFloat(n.toFixed(4));

Otra opción que hace casi lo mismo
Esta respuesta puede ayudar a su decisión

Number(n.toFixed(4));

toFixed truncará / rellenará el número a una longitud específica, pero también lo convertirá en una cadena. Convertir eso de nuevo en un tipo numérico no solo hará que el número sea más seguro para usarlo aritméticamente, sino que también eliminará automáticamente cualquier 0 final. Por ejemplo:

var n = "1.234000"; n = parseFloat(n); // n is 1.234 and in number form

Porque incluso si defines un número con ceros al final, se descartan.

var n = 1.23000; // n == 1.23;