Autor Tema: Pasar caracteres a dígitos numéricos y viceversa (C / C++ / java...)  (Leído 108754 veces)

Desconectado shicefgo

  • Member
  • ***
  • Mensajes: 166
Pasar caracteres a dígitos numéricos y viceversa (C / C++ / java...)
« en: 18 de Noviembre de 2013, 06:53:15 pm »
Buenas.
Este es un pequeño problema que está resuelto hace mucho tiempo, pero a veces encuentro en algún foro respuestas de lo más complicado, así que lo voy a dejar apuntado aquí ahora que me he vuelto a acordar y que tengo algo de tiempo.

El problema aparece cuando queremos tratar un dígito numérico como carácter, o bien convertir un carácter dígito a su valor numérico, es decir, cuando queremos convertir char c = '1' en int n = 1 o viceversa.

La solución es acordarse de que todos los dígitos numéricos son a su vez caracteres ASCII, y que el valor del carácter ASCII '0' (cero) es 48. Siendo n = un dígito númerico y c = un carácter numérico:

Para pasar de carácter a número: int n = (int) (c - 48);
Para pasar de número a carácter: char c = (char) (n + 48);

Incluso me voy a atrever a poner un par de ejemplos en C sin siquiera comprobar que funcionan, con que permitan comprender la idea me vale.
Código: [Seleccionar]
long
convertir_cadena_a_entero(const char *cad)
{
    long num = 0;
    int tam  = strlen(cad);  /* Longitud de la cadena recibida */
    int digito;
    int i;

    for (i = tam ; i > 0; --i) {
        digito = (int) (cad[i - 1] - 48);
        num += digito * pow(10.0, tam - i);
    }

    return num;
}
Código: [Seleccionar]
char *
convertir_entero_a_cadena(int num)
{
#define MAX_TAM 80

    char *cad;
    int digito;
    int i = 0;

    cad = (char*) malloc(MAX_TAM * sizeof(char));  /* No olvidar liberar la memoria asignada */
    memcpy(cad, "\0", MAX_TAM);  /* Bruto, pero efectivo :) */

    while (num >= 1) {
        digito = num % 10;

        if (i < MAX_TAM - 1) {
            cad[i] = (char) (digito + 48);           
            num -= digito;
            num /= 10;
        }

        ++i;
    }

    /* Pero los dígitos de la cadena han quedado en orden inverso,  */
    /* así que los ordenamos correctamente */

    int  tam = strlen(cad);
    char temp;

    for (i = 0; i < tam / 2; ++i) {
        temp = cad[i];
        cad[i] = cad[tam - i - 1];
        cad[tam - i - 1] = temp;
    }

    return cad;
}

También se puede hacer con tipos long, float, double y long double, pero hay que utilizar la función modf, modfl o la que proceda de su familia, para separar la parte entera de la parte decimal, y la función fmodl o la que proceda de su familia (en lugar del operador %), para ir obteniendo los dígitos de la parte entera (para obtener los de la parte decimal sólo hay que ir multiplicando por 10 y restando).

Pues nada más, saludos a todas y a todos. :)



 

Aviso Legal | Política de Privacidad | Política de Cookies

el contenido de la web se rige bajo licencia
Creative Commons License