Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Formato currency varia entre XP y Win7 (https://www.clubdelphi.com/foros/showthread.php?t=88893)

giulichajari 21-08-2015 19:46:36

Formato currency varia entre XP y Win7
 
Hola amigos..
Desarrolle una aplicacion en XP y el total de la factura me muestra en XP:

$ 20,00

Pero fui a Windows 7 a probar el sistema (otra maquina) y obtengo: (en el dbgrid y precio unitarios tambien):

20,00 €

Cuando quiero guardar la factura me dice que no es un valor valido.

El amigo ecfisa me recomendo:

Código Delphi [-]
function UnFormatCurr(const CurrValue: string): string;
begin
   Result:= CurrValue;
   Result:= StringReplace(Result, '$', '', [rfReplaceAll]);
   Result:= StringReplace(Result, '.', '', [rfReplaceAll]);
end;

Se podria solucionar con:

Código Delphi [-]
   Result:= StringReplace(Result, '€', '', [rfReplaceAll]);

y para que no se vea en euros y con el signo peso ($) como hago?

Gracias

Casimiro Notevi 21-08-2015 21:28:57

¿La configuración regional de windows qué parámetros tiene?

AgustinOrtu 21-08-2015 21:44:43

NO modifiques la configuracion regional del sistema operativo en ningun programa que hagas
Esa configuracion global esta asi porque el usuario lo seteo de esa forma por algun motivo x (llamese x un programa o servicio que si no tiene esa configuracion no funciona bien, o porque cuando usa el excel le gusta que el separador de decimales sea '.' y no '.' entre otras muchisimas cosas)

Los programas bien diseñados no dependen de la configuracion regional del sistema operativo para funcionar bien.
Los programas bien diseñados formatean la informacion al formato mas adecuado/necesario

Hay muchas formas de lograr el formato numerico o de fechas mas adecuado para tu programa

El mas sencillo es usando las variables globales de tu programa. Con esto te evitas andar lidiando con FormatSettings (si bien es posible crear funciones propias que inicializan el registro FormatSettings/pasan los argumentos correctos a las DateToStr, IntToStr, CurrToStr)

Yo suelo hacerlo con en el .dpr del proyecto:

Código Delphi [-]
program Project1;

uses
  Forms,
  SysUtils,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.UpdateFormatSettings := False;
  Application.UpdateMetricSettings := False;
  CurrencyString := '$';
  DecimalSeparator := '.';
  ThousandSeparator := ',';
  ShortDateFormat := 'dd\mm\yy';
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

Código Delphi [-]
  ShowMessage(CurrToStr(100.33)); // --> imprime 100.33
  ShowMessage(DateToStr(Now));  // --> imprime 21\08\15

Notar que es necesario agegar SysUtils en la secciones uses

Con esto le estas diciendo a Delphi que dentro de tu programa se usara determinada configuracion pero que NO modifique la configuracion regional del equipo

Esa configuracion es solo visible por tu programa,

MAXIUM 21-08-2015 23:34:51

Concuerdo con lo que explica AgustinOrtu.

Me a tocado ver aplicaciones que al intentat abrirlas, solicita al usuario cambiar estos parámetros en forma manual, de lo contrarió, no se abre.

Peor cuando esta instalado junto a otra aplicación que hace la misma burrada de cambiar los parámetros regionales del sistema (aló Softland) y ambos usan sistemas distintos. Es decir, no se pueden usar ambos al mismo tiempo.

Casimiro Notevi 22-08-2015 00:00:36

Cita:

Empezado por AgustinOrtu (Mensaje 495737)
NO modifiques la configuracion regional del sistema operativo en ningun programa que hagas
Esa configuracion global esta asi porque el usuario lo seteo de esa forma por algun motivo x (llamese x un programa o servicio que si no tiene esa configuracion no funciona bien, o porque cuando usa el excel le gusta que el separador de decimales sea '.' y no '.' entre otras muchisimas cosas)

Cita:

Empezado por MAXIUM (Mensaje 495740)
Concuerdo con lo que explica AgustinOrtu.
Me a tocado ver aplicaciones que al intentat abrirlas, solicita al usuario cambiar estos parámetros en forma manual, de lo contrarió, no se abre.
Peor cuando esta instalado junto a otra aplicación que hace la misma burrada de cambiar los parámetros regionales del sistema (aló Softland) y ambos usan sistemas distintos. Es decir, no se pueden usar ambos al mismo tiempo.


Por supuesto, hay que respetar siempre las configuraciones elegidas por los usuarios: configuración regional, colores, tamaños de letras, pantalla, etc. NUNCA debemos cambiar la configuración, sino adaptarnos a ella.

nlsgarcia 22-08-2015 01:56:08

AgustinOrtu,

Cita:

Empezado por AgustinOrtu
...Los programas bien diseñados no dependen de la configuración regional del sistema operativo para funcionar bien...Los programas bien diseñados formatean la información al formato mas adecuado/necesario...

^\||/

Nelson.

ecfisa 22-08-2015 14:58:09

Hola giulichajari.
Cita:

Empezado por giulichajari (Mensaje 495729)
...
y para que no se vea en euros y con el signo peso ($) como hago?

Si, recuerdo el hilo. Pero aquél era un caso muy diferente, donde estaba definido el punto "." para ambos separadores (miles y decimal).

Y también recuerdo mi advertencia final: ;)
Cita:

De todos modos es una forma muy frágil de obtener el valor ya que depende de las configuraciones locales de los equipos en que funciona la aplicación.
De todos modos, si no me perdí de algo, creo giulichajari no manifestó la intención de realizar un cambio en la configuración regional...

Para la consulta actual acerca de signos euro/peso, podes jugar con las variables CurrencyString y CurrencyFormat, la primera de las cuales ya te la indicó AgustinOrtu.

Ejemplo:
Código Delphi [-]
procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Clear;
  // Euro
  CurrencyString := '€'; // Símbolos: $, kr, £, ₤, R$, etc, ...
  CurrencyFormat := 3;   // un espacio despues del monto
  Memo1.Lines.Add(CurrToStrF(1234, ffCurrency, 0));
  // Peso
  CurrencyString := '$';
  CurrencyFormat := 2;   // un espacio delante del signo
  Memo1.Lines.Add(CurrToStrF(1234, ffCurrency, 0));
  // Euro (otro)
  CurrencyString := 'euros.'; // nombre
  CurrencyFormat := 3;
  Memo1.Lines.Add(CurrToStrF(1234, ffCurrency, 0));
  // Peso (otro)
  CurrencyString := 'pesos.';
  CurrencyFormat := 3; 
  Memo1.Lines.Add(CurrToStrF(1234, ffCurrency, 0));
end;
Muestra:


Casi me olvido... CurrToStrF


Saludos :)

giulichajari 23-08-2015 02:21:32

Gracias..
 
He probado todo y funciona correctamente..


La franja horaria es GMT +2. Ahora son las 03:54:40.

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