2010-05-19 20 views
5

He visto this format function hace referencia en varios sitios, pero ninguno de ellos tiene un ejemplo explícito de cómo pasar un número en la función.Al pasar en número, Number.prototype.format

He intentado con '12345'.format (' 0.00 '), que creo que es como debe escribirse, pero me da el error de que el objeto no admite la propiedad o el método. También probé el formato Number ('12345'). ('0.00'); var num = '12345' // num.format ('0.00'); formato ('0.00', '12345') e incluso han intentado usar números en lugar de las cadenas 12345.format (0.00). ¿Me estoy perdiendo algo realmente obvio aquí?

Copia incluida de la función de referencia para que no tenga que ir al sitio (con todas las piezas faltantes).

/** 
* I ♥ Google 
*/ 
String.prototype.stripNonNumeric = function() { 
    var str = this + ''; 
    var rgx = /^\d|\.|-$/; 
    var out = ''; 
    for(var i = 0; i < str.length; i++) { 
     if(rgx.test(str.charAt(i))) { 
      if(!((str.charAt(i) == '.' && out.indexOf('.') != -1) || 
      (str.charAt(i) == '-' && out.length != 0))) { 
       out += str.charAt(i); 
      } 
     } 
    } 
    return out; 
}; 

/** 
* Formats the number according to the 'format' string; adherses to the american number standard where a comma is inserted after every 3 digits. 
* note: there should be only 1 contiguous number in the format, where a number consists of digits, period, and commas 
*  any other characters can be wrapped around this number, including '$', '%', or text 
*  examples (123456.789): 
*   '0' - (123456) show only digits, no precision 
*   '0.00' - (123456.78) show only digits, 2 precision 
*   '0.0000' - (123456.7890) show only digits, 4 precision 
*   '0,000' - (123,456) show comma and digits, no precision 
*   '0,000.00' - (123,456.78) show comma and digits, 2 precision 
*   '0,0.00' - (123,456.78) shortcut method, show comma and digits, 2 precision 
* 
* @method format 
* @param format {string} the way you would like to format this text 
* @return {string} the formatted number 
* @public 
*/ 
Number.prototype.format = function(format) { 
    if (!(typeof format == "string")) {return '';} // sanity check 

    var hasComma = -1 < format.indexOf(','), 
     psplit = format.stripNonNumeric().split('.'), 
     that = this; 

    // compute precision 
    if (1 < psplit.length) { 
     // fix number precision 
     that = that.toFixed(psplit[1].length); 
    } 
    // error: too many periods 
    else if (2 < psplit.length) { 
     throw('NumberFormatException: invalid format, formats should have no more than 1 period: ' + format); 
    } 
    // remove precision 
    else { 
     that = that.toFixed(0); 
    } 

    // get the string now that precision is correct 
    var fnum = that.toString(); 

    // format has comma, then compute commas 
    if (hasComma) { 
     // remove precision for computation 
     psplit = fnum.split('.'); 

     var cnum = psplit[0], 
      parr = [], 
      j = cnum.length, 
      m = Math.floor(j/3), 
      n = cnum.length % 3 || 3; // n cannot be ZERO or causes infinite loop 

     // break the number into chunks of 3 digits; first chunk may be less than 3 
     for (var i = 0; i < j; i += n) { 
      if (i != 0) {n = 3;} 
      parr[parr.length] = cnum.substr(i, n); 
      m -= 1; 
     } 

     // put chunks back together, separated by comma 
     fnum = parr.join(','); 

     // add the precision back in 
     if (psplit[1]) {fnum += '.' + psplit[1];} 
    } 

    // replace the number portion of the format with fnum 
    return format.replace(/[\d,?\.?]+/, fnum); 
}; 

Respuesta

1

Ese no es el código completo - que le falta isType y stripNonNumeric métodos. Pero de todos modos, ya que es una extensión en el número de objetos en sí, puede utilizarlo como:

(42).format('0.00'); 

o

var a = 42; 
a.format('0.00'); 

'12345'.format('0.00') no funcionará como '12345' aquí es una cadena, pero el método ha sido definido solo para un número.

Consulte este question para saber por qué necesita incluir el número entre paréntesis y las formas en que puede pasarlo sin usarlo, aunque no lo recomendaría, debido a todos estos rumores sobre programadores de mantenimiento y hachas y demás. No digo que todos los programadores de mantenimiento lleven una en sus mochilas, pero ¿por qué arriesgarse? Les encanta piratear también pero no con el código ... hahahaha

+1

En realidad, no es necesario que encierre el número entre paréntesis, solo tiene que dejar un espacio entre el número y el punto. De esta forma, el intérprete no toma el punto como el separador de fracciones, sino como un operador de punto. '42 .format ('0.00')' – Andris

+0

Sí, pero no me gusta :) Consulte la pregunta adjunta: http://stackoverflow.com/questions/2726590/call-methods-on-native-javascript-types -sin-envoltura-con para más detalles sobre esto. – Anurag

+0

Noté que estaba incompleto después de revisarlo nuevamente. No entiendo cómo tanta gente en la red afirmó que esto funcionó para ellos ... pero de todos modos, usted respondió mi pregunta principal con bastante claridad. ¡Gracias! Una lástima que no puedo hacer funcionar la función. – Choy