Club Delphi  
    Paypal   FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 23-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Cita:
Empezado por lmpadron Ver Mensaje
El primer edit recibe el número y en su evento KeyPress hago lo siguiente
Código:
void __fastcall TForm6::DBEdit9KeyPress(TObject *Sender, char &Key)
{
  if(Key == '.')
  {
     Key = ',';
  }
}
Jamás deberías hacer una cosa así. Jamás. Tu código debe respetar las preferencias regionales del usuario, en este caso, el separador que usen para los decimales, coma o punto. No deberías tener que preocuparte por cuál caracter introduce el usuario. La función StrToFloat se encarga de eso y para ello utiliza el valor de la variable global DecimalSeparator. Dicho valor se establece en la inicialización de la unidad SysUtils haciendo una consulta a la configuración regional establecida en el sistema. Tú no deberías alterar el valor de dicha variable y, ni siquiera debería preocuparte saber su valor.

Si el usuario tiene configurado el sistema para usar una coma como separador decimal y oprime un punto, es problema del usuario, tú no debes tratar de adivinar lo que él quería hacer, simplemente dejas que el sistema le marque el error:

Cita:
'4.83' is not a valid floating point value.
A lo sumo, interceptas la excepción para dar un mensaje en español o más amigable:

Código Delphi [-]
var
  a: Double;

begin
  try
    a := StrToFloat(Edit1.Text);
  except
    on EConvertError do
      raise Exception.CreateFmt('%s no es un número flotante válido', [Edit1.Text]);
  end;
end;

En resumen, tu pregunta en este hilo ni siquiera debería darse. No lo digo por molestar, sino para enfatizar el hecho de que tu código no debería preocuparse por esto.

// Saludos
Responder Con Cita
  #2  
Antiguo 23-02-2012
Avatar de escafandra
[escafandra] escafandra is offline
Miembro Premium
 
Registrado: nov 2007
Posts: 2.211
Poder: 22
escafandra Tiene un aura espectacularescafandra Tiene un aura espectacular
Cita:
Empezado por roman Ver Mensaje
Jamás deberías hacer una cosa así. Jamás. Tu código debe respetar las preferencias regionales del usuario, en este caso, el separador que usen para los decimales, coma o punto. ...

...En resumen, tu pregunta en este hilo ni siquiera debería darse. No lo digo por molestar, sino para enfatizar el hecho de que tu código no debería preocuparse por esto.
La apreciación de roman es muy cierta. Códigos como el que expones puede dar lugar a incertidumbre y frustración en el usuario. Nunca debes cambierle su configuración aunque puedes leerla tranquilamente.

Sin embargo no veo mal que exponga sus dudas pues el tema es útil desde el punto de vista didáctico. Ha servido para que tanto lmpadron como otros en su situación, se den cuenta de la existencia de distintas configuraciones del separador decimal y otros, como bien apunta ecfisa, y de pié al sabio consejo de roman.


Saludos.
Responder Con Cita
  #3  
Antiguo 23-02-2012
Avatar de lmpadron
lmpadron lmpadron is offline
Miembro
 
Registrado: feb 2009
Ubicación: Habana, Cuba
Posts: 204
Poder: 18
lmpadron Va por buen camino
Cita:
Empezado por roman Ver Mensaje
Jamás deberías hacer una cosa así. Jamás. Tu código debe respetar las preferencias regionales del usuario
Román, como dices, algo así no debería hacerse y lo de respetar la configuración del usuario esta más que claro sin embargo los usuarios que van a usar este software deben insertar aproximadamente 3000 planillas en solo 8 horas por ende han solicitado que sea de la forma mas cómoda posible, lanzar un mensaje de error los haría primeramente tener que parar de insertar los datos además estarían forzados a usar la coma del teclado que es mucho mas incomoda cuando insertamos números dado que generalmente lo hacemos desde el área numérica del teclado (en caso de que esa sea su configuración).

Después de leer tu post reuní a los futuros usuarios y los puse al tanto del asunto y todos estuvieron de acuerdo en que hiciera lo que fuera necesario para que sea mas simple y cómoda la inserción de los datos en la base de datos.

Cita:
Empezado por roman Ver Mensaje
No lo digo por molestar, sino para enfatizar el hecho de que tu código no debería preocuparse por esto.
No se preocupe, nunca es molestia recibir un consejo y mas aun cuando es tan tan bueno.

Cita:
Empezado por gersojn Ver Mensaje
Hola, veras, para realizar el calculo sin que tengas problemas, efectivamente debes realizar la conversion Internamente(para que el usuario no lo perciba y trabaje a comodidad) o bien, externamente.
La solución de gersojn es muy buena pero no quisiera modificar el registro de todos mis usuarios y usar esa solución para determinar que esta usando como separador decimal y después efectuar el cambio es un problema inmenso ya que aunque mi soft se adapte a cada pc aun así estarían escribiendo en la base de datos los decimales con puntos o comas según su configuración y seria después muy molesto hacer algún calculo.

Cita:
Empezado por escafandra Ver Mensaje
Creo que no has entendido la sugerencia de ecfisa
Pues si, tenias toda la razón realmente no la había entendido pero después de revisarla he decidido hacer la conversión interna como indica ecfisa y asi no modificar las preferencias regionales de los usuarios de acuerdo al consejo de Román

Cita:
Empezado por ecfisa Ver Mensaje
Código:
  DecimalSeparator = '.';  // muestra: 125.000.12
  // o 
  DecimalSeparator = ',';  // muestra: 125.000,12
Al final el codigo ha quedado asi

Código:
void __fastcall TForm6::DBEdit9Change(TObject *Sender)
{           
           DecimalSeparator = '.'
           float a,b,c;
           b = Round(StrToFloat(Edit1->Text),2);
           c = 7.33;

           if (b == c)
           {
                DBEdit2->Text = "0";
           }
           else
           {
                if (b > c)
                {
                        MessageDlg("Upsss lo siento !!!!, el número A es mayor al numero B",mtInformation, TMsgDlgButtons() << mbOK, 0);
                }
                else
                {
                        a = c - b;
                        Edit2->Text = FloatToStr(Round(a,2));
                }
           }
}
De esta forma me funciona perfecto.

Quiciera agradecerles a todos los que me han ayudado a averiguar finalmente cual es el separador decimal en los float jamas imaginarme que estaba en el registro, eso explica porque el mismo código funcionaba perfecto en una pc y muy mal en otras. De paso he aprendido que existe DecimalSeparator para este tipo de casos.

Gracia a todos por prestarme su ayuda y su tiempo
__________________
Nunca esta de más volver a ver la "Guia de Estilo" o "La Otra Guia de Estilo". Recuerda siempre usar los "Tags" para una mejor legibilidad de tu código.


Cuando miras fijamente al abismo, este te devuelve la mirada


oo______ooo_____ooo_ooooooo_____ooo____oooooo____ooooooo______oooo____ooo____oo_
oo______oooo___oooo_oo____oo__oo___oo__oo____oo__oo____oo___oo____oo__oooo___oo_
oo______oo_oo_oo_oo_oo____oo_oo_____oo_oo_____oo_oo____oo__oo______oo_oo_oo__oo_
oo______oo__ooo__oo_oooooo___ooooooooo_oo_____oo_ooooooo___oo______oo_oo__oo_oo_
oo______oo_______oo_oo_______oo_____oo_oo____oo__oo____oo___oo____oo__oo___oooo_
ooooooo_oo_______oo_oo_______oo_____oo_oooooo____oo_____oo____oooo____oo____ooo_
________________________________________________________________________________

Última edición por lmpadron fecha: 23-02-2012 a las 16:28:26.
Responder Con Cita
  #4  
Antiguo 23-02-2012
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
No creo que tenga caso colocar la asignación

Código:
DecimalSeparator = '.'
en el evento OnChange. Colócala en el constructor del formulario o en alguna parte similar al comienzo de tu aplicación.

// Saludos
Responder Con Cita
  #5  
Antiguo 23-02-2012
Avatar de Chris
[Chris] Chris is offline
Miembro Premium
 
Registrado: abr 2007
Ubicación: Jinotepe, Nicaragua
Posts: 1.678
Poder: 21
Chris Va por buen camino
Cita:
Empezado por lmpadron Ver Mensaje
Román, como dices, algo así no debería hacerse y lo de respetar la configuración del usuario esta más que claro sin embargo los usuarios que van a usar este software deben insertar aproximadamente 3000 planillas en solo 8 horas por ende han solicitado que sea de la forma mas cómoda posible, lanzar un mensaje de error los haría primeramente tener que parar de insertar los datos además estarían forzados a usar la coma del teclado que es mucho mas incomoda cuando insertamos números dado que generalmente lo hacemos desde el área numérica del teclado (en caso de que esa sea su configuración).
Lo de mostrar un MessageBox ya lo hemos discutido. Ahora, con respecto a la comodidad del usuario y el punto que toca Román -súper importante-. Ve, asignarle directamente un valor a las variables como DecimalSeparator no es recomendable. Para hacer las conversiones, a cómo ha dicho Román, basta con un StrToFloat. Pero quieres que el divisor del punto flotante sea con . -punto-. Puedes hacer esto con StrToFloat se forma muy sencilla. Fíjate (código en Delphi):

Código Delphi [-]
var
    FS: TFormatSettings;
    NumberAsFloat: Double;
begin
    FS.DecimalSeparator := '.'; // usar . para punto decimal
    
    try
        NumberAsFloat := StrToFloat(Edit1.Text, FS); // el ultimo parametro
                                                     // es el que hace la magia
    except on EValueError do
        ShowBalloonTip ...
    end;
    
    ..
end;

¿Viste que fácil y claro el código?

Saludos!
__________________
Perfil Github - @chrramirez - Delphi Blog - Blog Web
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Convertir coma en punto lucho1981 SQL 2 22-04-2009 23:47:06
Coma presionando punto.. Delfino Varios 2 20-10-2007 11:47:11
cambiar el punto por la coma carlosll Varios 6 12-04-2007 19:11:57
Sustituir punto por coma Carlos Arevalo Varios 3 13-10-2005 23:19:40
xml punto coma carlomagno Varios 2 06-09-2004 11:49:35


La franja horaria es GMT +2. Ahora son las 20:54:42.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi