Convertir una cadena a double en c++ builder

By rtmex

La siguiente función recibe una cadena, elimina de la misma todos los caracteres que no sean números y regresa un double.

Acepta el caracter – al principio de la cadena para indicar números negativos y un punto para separar decimales (sólo se acepta el primer punto que contenga la cadena)

Ejemplo:  Si la función recibe la cadena “5-A-6200″, regresará un double cuyo valor será 56200.

Si la cadena no se puede convertir a un número, la función regresa el número cero.


double __fastcall TForm1::ConvierteANumero(String s_cadena)
{
 String s_aux="";
 bool bl_negativo=false;

 // Si la cadena que recibe está vacia, regresa 0
 if (s_cadena=="")
     s_aux="0";
 else
     {
      // Checa el primer caracter para ver si es el signo menos
      if (s_cadena.SubString(1,1)=="-")
          bl_negativo=true;

      // Va recorriendo la cadena que recibe y pasando a s_aux sólo los números y el punto
      for (int i_x=1;i_x <=s_cadena.Length();i_x++)
          {
           if (s_cadena.SubString(i_x,1)>= '0' && s_cadena.SubString(i_x,1)<= '9')
               s_aux=s_aux+s_cadena.SubString(i_x,1);
           else
               {
                // Si el caracter es un punto, verifica que no exista ya un punto en la cadena
                if (s_cadena.SubString(i_x,1) == '.' && s_aux.Pos('.')==0)
                    s_aux=s_aux+s_cadena.SubString(i_x,1);
               }
          }
     }
 if (bl_negativo)
     s_aux="-"+s_aux;

 // Si la cadena resultante está vacia, segnifica que s_cadena no contenía ningún número, sólo caracteres. así que se convierte a 0
 if (s_aux.IsEmpty())
     s_aux="0";
 else
     if (s_aux.Length()==1 && !(s_aux >= '0' && s_aux <= '9'))
         s_aux="0";

 return s_aux.ToDouble();
}

Etiquetas: ,

Escribe un comentario