Crea la palabra inglesa para un número -- python campo con python-3.x campo con integer campo con numbers-to-words camp codereview Relacionados El problema

Create the English word for a number


13
vote

problema

Español

Combiné una función de varias fuentes que lleva un número entero y lo devuelve como su respectiva palabra inglesa formateada como una cadena. La función es la siguiente:

  def int2word(num, separator="-"):     """Transforms integers =< 999 into English words      Parameters     ----------     num : int     separator : str      Returns     -------     words : str     """     ones_and_teens = {0: "Zero", 1: 'One', 2: 'Two', 3: 'Three',                       4: 'Four', 5: 'Five', 6: 'Six', 7: 'Seven',                       8: 'Eight', 9: 'Nine', 10: 'Ten', 11: 'Eleven',                       12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen',                       15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen',                       18: 'Eighteen', 19: 'Nineteen'}     twenty2ninety = {2: 'Twenty', 3: 'Thirty', 4: 'Forty', 5: 'Fifty',                      6: 'Sixty', 7: 'Seventy', 8: 'Eighty', 9: 'Ninety', 0: ""}      if 0 <= num < 19:         return ones_and_teens[num]     elif 20 <= num <= 99:         tens, below_ten = divmod(num, 10)         if below_ten > 0:             words = twenty2ninety[tens] + separator +                  ones_and_teens[below_ten].lower()         else:             words = twenty2ninety[tens]         return words      elif 100 <= num <= 999:         hundreds, below_hundred = divmod(num, 100)         tens, below_ten = divmod(below_hundred, 10)         if below_hundred == 0:             words = ones_and_teens[hundreds] + separator + "hundred"         elif below_ten == 0:             words = ones_and_teens[hundreds] + separator +                  "hundred" + separator + twenty2ninety[tens].lower()         else:             if tens > 0:                 words = ones_and_teens[hundreds] + separator + "hundred" + separator + twenty2ninety[                     tens].lower() + separator + ones_and_teens[below_ten].lower()             else:                 words = ones_and_teens[                     hundreds] + separator + "hundred" + separator + ones_and_teens[below_ten].lower()         return words      else:         print("num out of range")   
Original en ingles

I cobbled together a function from various sources that takes an integer and returns it as its respective English word formatted as a string. The function is as follows:

def int2word(num, separator="-"):     """Transforms integers =< 999 into English words      Parameters     ----------     num : int     separator : str      Returns     -------     words : str     """     ones_and_teens = {0: "Zero", 1: 'One', 2: 'Two', 3: 'Three',                       4: 'Four', 5: 'Five', 6: 'Six', 7: 'Seven',                       8: 'Eight', 9: 'Nine', 10: 'Ten', 11: 'Eleven',                       12: 'Twelve', 13: 'Thirteen', 14: 'Fourteen',                       15: 'Fifteen', 16: 'Sixteen', 17: 'Seventeen',                       18: 'Eighteen', 19: 'Nineteen'}     twenty2ninety = {2: 'Twenty', 3: 'Thirty', 4: 'Forty', 5: 'Fifty',                      6: 'Sixty', 7: 'Seventy', 8: 'Eighty', 9: 'Ninety', 0: ""}      if 0 <= num < 19:         return ones_and_teens[num]     elif 20 <= num <= 99:         tens, below_ten = divmod(num, 10)         if below_ten > 0:             words = twenty2ninety[tens] + separator + \                 ones_and_teens[below_ten].lower()         else:             words = twenty2ninety[tens]         return words      elif 100 <= num <= 999:         hundreds, below_hundred = divmod(num, 100)         tens, below_ten = divmod(below_hundred, 10)         if below_hundred == 0:             words = ones_and_teens[hundreds] + separator + "hundred"         elif below_ten == 0:             words = ones_and_teens[hundreds] + separator + \                 "hundred" + separator + twenty2ninety[tens].lower()         else:             if tens > 0:                 words = ones_and_teens[hundreds] + separator + "hundred" + separator + twenty2ninety[                     tens].lower() + separator + ones_and_teens[below_ten].lower()             else:                 words = ones_and_teens[                     hundreds] + separator + "hundred" + separator + ones_and_teens[below_ten].lower()         return words      else:         print("num out of range") 
           

Lista de respuestas

23
 
vote
vote
La mejor respuesta
 

Hay una forma más fácil.

Tenemos el módulo 9988776655544330 fácilmente instalado a través de pip :

  pip install num2words   

La ventaja de este módulo es que admite múltiples idiomas:

  • es (inglés, predeterminado)
  • fr (francés)
  • de (alemán)
  • es (español)
  • lt (lituano)
  • lv (letón)
  • EN_GB (inglés británico)
  • en_in (indio inglés)
  • no (noruego)
  • pl (polaco)
  • ru (ruso)
  • DK (Danés)
  • PT_BR (Portugués brasileño)

Más, incluso puede generar números ordinales como cuarenta y segundo .

Un pequeño ejemplo de Python para convertir números a las palabras usando num2words se ve así:

  >>> from num2words import num2words >>> num2words(42) forty-two >>> num2words(42, ordinal=True) forty-second   

Puede leer más sobre lo que puede hacer usando este módulo aquí


Nota: En caso de que alguien se pregunte por qué esto no es una revisión de código (como los comentarios sobre el código publicado), se debe a la pregunta sin editar, el autor preguntó específicamente si ya hay una biblioteca para esto.

 

There's an easier way.

We have the num2words module which can be easily installed via pip:

pip install num2words 

The advantage of this module is that it supports multiple languages:

  • en (English, default)
  • fr (French)
  • de (German)
  • es (Spanish)
  • lt (Lithuanian)
  • lv (Latvian)
  • en_GB (British English)
  • en_IN (Indian English)
  • no (Norwegian)
  • pl (Polish)
  • ru (Russian)
  • dk (Danish)
  • pt_BR (Brazilian Portuguese)

More, you can even generate ordinal numbers like forty-second.

A small python example for converting numbers to words using num2words looks like this:

>>> from num2words import num2words >>> num2words(42) forty-two >>> num2words(42, ordinal=True) forty-second 

You can read more about what you can do using this module here


NOTE: In case somebody is wondering why this is not a code review (such as comments on the posted code), is because in the unedited question the author specifically asked if there is already a library for this.

 
 
     
     
11
 
vote

Tienes un error bastante grande allí. En esta parte:

  elif 100 <= num <= 999:     hundreds, below_hundred = divmod(num, 100)     tens, below_ten = divmod(below_hundred, 10)   

Si tiene algo en que los dos últimos dígitos son menos de 20, va a fallar porque el resultado va a ser 9988777665544336 y 10 - ese número (si tiene 9988776655544337 < / Código>, obtendrá 1 y 9 ), que conduce a un LEYERROR.

SO, CUALQUIER NÚMERO COMO pip0 , 99887766555443311 , 99887766555443312 y así lo hará fallar. Yo diría que se pegue con el pip3 que se sugirió de dex'ter o estar preparado para hacer bastante depuración.

 

You have quite a big bug there. In this part:

elif 100 <= num <= 999:     hundreds, below_hundred = divmod(num, 100)     tens, below_ten = divmod(below_hundred, 10) 

If you have anything where the last two digits are less than 20, it's going to fail because the result is going to be 1 and 10 - that number (if you have 19, you'll get 1 and 9), which leads to a KeyError.

So, any number like 119, 315, 417 and so on will make it fail. I'd say stick with the num2words that @Dex'ter suggested or be prepared to do quite some debugging.

 
 

Relacionados problema

15  Uno, dos, tres, ... un, deux, trois, ..., maxbound :: int  ( One two three un deux trois maxboundint ) 
Escribí una números -El convertidor de palabras para el inglés, luego intentó adaptar el código para trabajar para el francés. Me pregunto principalmente ...

3  Sistema de numeración india: convirtiendo en las palabras / cadenas oficiales y de uso común  ( Indian numbering system converting into the official and common use numbering ) 
He desarrollado la siguiente función corta de JavaScript para convertir números a los formatos del sistema de numeración india; Tanto el sistema de numeración...

4  Convertir un número en texto húngaro  ( Converting a number into hungarian text ) 
Me gustaría convertir un número entero de una celda entre 0 y 1,000,000.0000 en texto húngaro. Ya he encontrado una solución, una función VBA. ¿Cómo se pued...

15  Uno, dos, tres, ... un, deux, trois, ..., maxbound :: int  ( One two three un deux trois maxboundint ) 
Escribí una números -El convertidor de palabras para el inglés, luego intentó adaptar el código para trabajar para el francés. Me pregunto principalmente ...

8  Dividiendo una mitad de la mitad en palabras y medio número  ( Dividing a number half into words and half number ) 
Ejemplo: Si tengo un número 1000: Primero pongo comas (en inglés estándar) que lo hace: 1,000 dividí lo anterior en la primera coma: obtengo 1 C...

4  Números decimales a la representación de cadenas inglesas  ( Decimal numbers to english string representation ) 
¿Hay algo que pueda haber vuelto a trabajar aquí? Tengo una mente de Java 7, pero estoy trabajando para preparar mi Java 8, por lo que si hay alguna mejoras s...

3  Convertir números a palabras en inglés  ( Converting numbers to english words ) 
Este es un programa simple para convertir un número, desde 0 hasta 99999999, a palabras en inglés. Ejemplo: Si la entrada es: 1234 La salida sería:...

4  Imprima y calcule los números escritos franceses de 1 a 1000 usando Java imperativo  ( Print and calculate french written numbers from 1 to 1000 using imperative java ) 
He escrito un poco (imperativo) Java Programa que básicamente imprime todos los números escritos franceses de 1 a 1000. (Estoy aprendiendo a escribirlos) ...

3  Entero a la conversión inglesa  ( Integer to english conversion ) 
Escribí algún código para traducir números (por ahora, solo positivo, hasta el límite de 32 bits) en palabras en inglés. Todo funciona y estoy feliz. Busqué...

5  Proyecto EULER NO. 17: contando letras para escribir los números de 1 a 1000  ( Project euler no 17 counting letters to write the numbers from 1 to 1000 ) 
Soy muy nuevo en la programación y, cierto, estoy avergonzado de compartir mi código para la crítica. Este código funciona y produce la respuesta correcta a l...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos