2011-07-08 13 views
5

Sólo me preguntaba si hay bibliotecas que pueden convertir fácilmente los números en sus representaciones de cadena en JavaScript, jQuery, PHP, Python, etc ...Número de secuencia - Cómo convertir 150 en "ciento cincuenta"

Por ejemplo, necesito convertir 1,210 en "Mil Ciento Doscientos Diez".

¿Hay un nombre para este procedimiento?

+1

El libro Algorithms Unplugged (http://www.amazon.com/Algorithms-Unplugged-Berthold-V%C3%B6cking/dp/3642153275) cubre este problema de una manera agradable. – 01es

Respuesta

2

Solución Javascript. Es compatible con todos los enteros desde el infinito hasta el infinito negativo:

var GetWord; 
(function(){ 
    GetWord = function (number) {//number must be an integer 
     return (function f(number){ 
      var output = []; 
      var is_negative = number < 0; 
      number = Math.abs(number); 

      var chunks = []; 
      for (var x = count_names.length - 1, limit = 0; x >= limit; --x) { 
       var chunk = Math.floor(number/counts[x]); 
       if (chunk !== 0) { 
        output.push(GetWord(chunk) + " " + count_names[x]); 
       } 
       chunks[x] = chunk; 
       number -= chunk * counts[x]; 
      } 
      if (number !== 0) { 
       if (number <= 19) { 
        output.push(number_names[number]); 
       } else { 
        var tens = Math.floor(number/10); 
        number -= tens * 10; 
        if (number === 0) { 
         output.push(number_names2[tens - 2]); 
        } else { 
         output.push(number_names2[tens - 2] + " " + GetWord(number)); 
        } 
       } 
      } 
      if (output.length > 2) { 
       for (var x = 0, limit = output.length - 1; x < limit; ++x) { 
        output[x] += "," 
       } 
      } 
      if (output.length > 1) { 
       var ubound = output.length - 1; 
       output[output.length] = output[ubound]; 
       output[ubound] = "and"; 
      } 
      if (is_negative) { 
       output.splice(0, 0, "negative"); 
      } 
      return output; 
     })(number).join(" "); 
    }; 
    var number_names = ["zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen"]; 
    var number_names2 = ["twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety", "hundred"] 
    var count_names = ["hundred", "thousand", "million", "billion", "trillion", "quadrillion", "quintillion", "sextillion", "septillion", "octillion", "nonillion", "decillion", "undecillion", "duodecillion", "tredecillion", "quattuordecillion", "quindecillion", "sexdecillion", "septendecillion", "octodecillion", "novemdecillion", "vigintillion"]; 
    var counts = [100]; 
    for (var x = counts.length, limit = count_names.length; x < limit; ++x) { 
     counts.push(Math.pow(1000, x)); 
    } 
})(); 

Uso:

GetWord(1210); da one thousand, two hundred, and ten

GetWord(2147483647); da two billion, one hundred and forty seven million, four hundred and eighty three thousand, six hundred, and forty seven

GetWord(-123876124); da negative one hundred and twenty three million, eight hundred and seventy six thousand, one hundred, and twenty four

Si las necesita, simplemente cambie esas plantillas de matriz en el formulario "limitado".

Cuestiones relacionadas