2010-04-28 17 views
51

Duplicar posibles:
How can I convert an integer into its verbal representation?números de convertir en palabras C#

¿Alguien puede dar un código de imprimación que podía trabajar en convertir números en palabras?

números de Conversión a palabras (que van desde -1000 a +1000) ejemplo: 1000 -> mil

+15

suena como tarea –

+0

¿Como en convertir números en cadenas? O convertir números en representaciones de palabras de ese número, p. 2030 = dos mil treinta? – froadie

+0

¿Hizo una búsqueda primero?=/ – Jens

Respuesta

-5

Realmente es necesario proporcionar más detalles con respecto a qué se refiere. ¿Te refieres a "palabras" o "cuerdas"?

Por ejemplo, si desea convertir un número en una cadena, entonces lo que sólo necesita algo como esto:

int i = 123; 
string text = i.ToString(); 

De hecho, incluso se puede hacer esto:

(123).ToString(); // u need to put number in parenthesis 

e incluso

(123.5).ToString(); // this always trips me out 

Sin embargo, si usted necesita para convertir 123 en one hundred twenty three, entonces necesitas hacer más análisis sintáctico. Tendría que dividir el número en sus partes, como cientos, décimas, etc.

Puede comenzar por obtener la longitud de la cuerda (para ints) para averiguar dónde comenzar la avería. Por ejemplo, 123 tiene 3 dígitos, así que deja que N = 3 e i = 1. A continuación, comienzas dividiendo 123 entre 10 (Ni) o 100. Esto te da 1. Ahora sabes que la palabra comenzará con "uno" cien". Luego incrementa i, resta ese número (100) y divídelo entre 10 (N-i), o 10 - esto te da 2. Haz esto hasta que N == i.

Espero que esto ayude. Realmente deberías editar tu pregunta.

+0

@Juan: bien, ahora veo que editó su pregunta. Creo que mi respuesta te ayudará a avanzar en la dirección correcta. – Dave

+0

pero hay un problema. Por ejemplo, si tiene números con 5 dígitos o 6 dígitos, ... su método no funciona. Por ejemplo, 12341 en este número deberíamos tener doce mil y ... pero tu método no puede decir doce mil. – Martin

+0

@Martin True. Pero ya hay una mejor respuesta. – Dave

1

Cuando tuve que resolver este problema, creé un diccionario de datos codificado para mapear entre los números y sus palabras asociadas. Por ejemplo, el siguiente podría representar unas pocas entradas en el diccionario:

{1, "one"} 
{2, "two"} 
{30, "thirty"} 

que realmente sólo tiene que preocuparse acerca de los números de asignación en la 10^0 (1,2,3, etc.) y 10^1 (10,20,30) posiciones porque una vez que llega a 100, simplemente tiene que saber cuándo usar palabras como cien, mil, millón, etc. en combinación con su mapa. Por ejemplo, cuando se tiene un número como 3240123, se obtiene: tres millones dedos cien mil cuarentaun centenar deveintitrés.

Después de construir su mapa, necesita trabajar con cada dígito en su número y averiguar la nomenclatura apropiada para ir con él.

161
public static string NumberToWords(int number) 
{ 
    if (number == 0) 
     return "zero"; 

    if (number < 0) 
     return "minus " + NumberToWords(Math.Abs(number)); 

    string words = ""; 

    if ((number/1000000) > 0) 
    { 
     words += NumberToWords(number/1000000) + " million "; 
     number %= 1000000; 
    } 

    if ((number/1000) > 0) 
    { 
     words += NumberToWords(number/1000) + " thousand "; 
     number %= 1000; 
    } 

    if ((number/100) > 0) 
    { 
     words += NumberToWords(number/100) + " hundred "; 
     number %= 100; 
    } 

    if (number > 0) 
    { 
     if (words != "") 
      words += "and "; 

     var unitsMap = new[] { "zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; 
     var tensMap = new[] { "zero", "ten", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety" }; 

     if (number < 20) 
      words += unitsMap[number]; 
     else 
     { 
      words += tensMap[number/10]; 
      if ((number % 10) > 0) 
       words += "-" + unitsMap[number % 10]; 
     } 
    } 

    return words; 
} 
+0

lo convirtió en un buen método de extensión, si no le importa ... – nawfal

+0

@nawfal: la recursión en NumberToWords no es correcta después de su edición. –

+3

@tomp Volví a la versión anterior, no porque no podría haber corregido el error tipográfico, pero que un método de extensión en una int para esto no se ve bien ... – nawfal

Cuestiones relacionadas