Delphi - SOLO 2 DECIMALES

 
Vista:

SOLO 2 DECIMALES

Publicado por R3DRUM (15 intervenciones) el 25/05/2007 13:18:06
HOLA:

El otro día pregunté como hacer que un "Edit" solo acepte números. Me sirvió, pero ahora me ha salido otro problema, y es que puedo ponerle la cantidad de decimales hasta que se agote la propiedad que le he dado en el "max length".

Entonces os pregunto como puedo hacer para que una vez pulsado el punto (o coma) de los decimales, solo acepte dos dígitos más, es decir, que pueda ponerle esto números:

6500.99
5.06

y no me permita poner estos:

3.52265
66.236
66.3365

Bueno, muchas gracias
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:SOLO 2 DECIMALES

Publicado por Dr Juzam (821 intervenciones) el 25/05/2007 14:46:53
Puedes usar la función formatfloat. Convierte un número a un string siguiendo una máscara que le indiques. En concreto si quieres 2 decimales creo que es así:

FormatFloat ('0.00', TuNumero).

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por Dr Juzam (821 intervenciones) el 25/05/2007 15:12:31
Me corrijo, que no entendí bien tu pregunta ;-D

Se me ocurre el siguiente código:

procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
var
PosPunto, MaxDecimales: integer;
begin
MaxDecimales:=2; //Numero máximo de decimales permitidos
PosPunto:=Pos ('.', Edit1.Text);
if PosPunto>0 then
if Length (Edit1.Text)-PosPunto>MaxDecimales-1 then
Key:=#0;
end;

Sin embargo, tiene algunos fallos que te dejo a ti pulir, como por ejemplo que cuando se alcanza el número máximo de decimales permitido ya no dejar hacer nada más (ni borrar ni nada).

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por BigLuis (713 intervenciones) el 25/05/2007 16:39:18
Dr, no te comas el coco. Sacado de la ¡¡¡¡ AYUDA DE DELPHI !!!

R3DRUM hay que hojear la ayuda.

ROUND (numeric_exp, [ decimals = 0 [, rounding_mode = HalfEven ] ])

The round function returns a number rounded to the specified length or precision.
The decimals parameter is the precision to which numeric_exp is to be rounded
The rounding_mode possible values are:

HalfEven - Round to nearest or to even whole number. ("Banker's Rounding")
HalfPos - Round to nearest or toward positive.
HalfNeg - Round to nearest or toward negative.
HalfDown - Round to nearest or toward zero.
HalfUp - Round to nearest or away from zero.
RndNeg - Round toward negative. (i.e. Floor)
RndPos - Round toward positive. (i.e. Ceil)
RndDown - Round toward zero. (i.e. Trunc)
RndUp - Round away from zero.

Example:

ROUND(4.6) returns 5
ROUND(4.56, 1) returns 4.6
ROUND(1.235, 2) returns 1.24
ROUND(1.245, 2) returns 1.24
ROUND(1.245, 2, HalfPos) returns 1.25

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:SOLO 2 DECIMALES

Publicado por E.T. (1244 intervenciones) el 25/05/2007 17:56:25
Este procedimiento te permite escribir, números con dos decimales, negativos.

Funciona de la siguiente manera, puedes escribir el signo menos (-) al inicio sólamente del edit, no te permite escribir más de uno, una vez pulsado el punto no puedes escribir más que los do decimales además si intentas escribir el punto dejando más de 2 decimales no te lo permite (es decir si tienes 7 numeros escritos e intentas pones el punto al inicio no te dejerá), si encuentras un detalle me dices.

Debes de poner el codigo en el evento OnKeyPress del edit, enciando como parámetro un edit y la tecla presionada (Ejemplo: ValidarDecimalDos(sender as tedit, key));

NOTA: El codigo no está optimizado pero funciona

procedure ValidarDecimalDos(Editor: TEdit; var Tecla: Char); overload;
begin
if tecla<>#8 then begin
if (tecla='-') and (pos('-', Editor.Text)=0)and (Editor.SelStart=0) then
Tecla:='-'
else begin
if (tecla='-') and (pos('-', Editor.Text)=0)and(length(editor.Text)<>0)
and(Editor.SelStart=0) then begin
Tecla:='-';
end
else begin
if (length(editor.Text)<>0)and(Editor.Text[1]='-')and(Editor.SelStart=0) then
Tecla:=#0
else begin
if (pos('.', Editor.Text)=0)and(Editor.SelStart>=(length(Editor.Text)-2)) then begin
if not (Tecla in ['0'..'9','.',#8]) then
Tecla:=#0;
end
else
if (length(Editor.Text)-pos('.', Editor.Text))<2 then begin
if not (Tecla in ['0'..'9',#8]) then Tecla:=#0;
end
else
if (Editor.SelStart)<(pos('.', Editor.Text)) then begin
if not (Tecla in ['0'..'9',#8]) then
Tecla:=#0;
end
else begin
if tecla<>#8 then
tecla:=#0;
end;
end;
end;
end;
end;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:SOLO 2 DECIMALES

Publicado por E.T. (1244 intervenciones) el 25/05/2007 18:06:01
Encontré un error, deja lo corrijo y lo mando de nuevo
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:SOLO 2 DECIMALES

Publicado por E.T. (1244 intervenciones) el 25/05/2007 19:04:18
Listo, al parecer ya está corregida y optimizada, solo hay que probarla bien, según yo ya está pero tu pruebala, se llama de la misma manera que la anterior.

En el evento OnKeyPress del edit

ValidarDecimalDos(Sender as TEdit, Key);


procedure ValidarDecimalDos(Editor: TEdit; var Tecla: Char); overload;
begin
if Tecla in['0'..'9','.','-']then begin
if (Tecla='-')and((pos(tecla,Editor.Text)<>0)or(Editor.SelStart>0)) then begin
Tecla:=#0;
end else begin
if (Tecla='.')and((pos(Tecla,Editor.Text)<>0)or((pos('-',Editor.Text)=1)and(Editor.SelStart=0))
or((length(Editor.Text)-Editor.SelStart)>2))then begin
Tecla:=#0;
end else begin
if ((Editor.SelStart=0)and(pos('-',Editor.Text)<>0))
or((pos('.',Editor.Text)<>0)and(Editor.SelStart>=pos('.',Editor.Text))
and((length(Editor.Text)-pos('.',Editor.Text))>=2)) then
Tecla:=#0;
end;
end;
end else if tecla<>#8 then
Tecla:=#0;
end;
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por BigLuis (713 intervenciones) el 26/05/2007 10:26:43
Vale ET, si lo que quieres es implementar tu una funcion ¿no crees que hay que tender a lo mas simple?

Añadiendo la unidad Math al uses escribe esto:

x=numero que se tiene; D=numero de decimales deseados;

function RoundD(x:Extended;D:Integer):Extended;
var
n:Extended;
begin
n:=Power(10,d);
x:=x*n;
Result:=(int(x)+Int(Frac(x)*2))/n;
end;

Por favor no te molestes pero creo que una de las finalidades de un foro de programacion es entre todos intertar optimizar lo mas posible el codigo.

Suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por nombre (106 intervenciones) el 26/05/2007 17:03:28
La pregunta de R3DRUN es como evitar que el usuario ponga más de dos decimales en el edit, por lo que la función Round no lo evitaría. No se si hay algún motivo por el que no quiera dejar teclear al usuario más que los dos decimales, porque si no bastaría con poner esta línea en el evento OnExit del Edit1 :

//Multiplicar por 100, coger la parte entera, dividir entre 100
Edit1.text := FloatToStr( Int(StrToFloat(Edit1.Text)*100) / 100 );
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 65
Oro
Ha mantenido su posición en Delphi (en relación al último mes)
Gráfica de Delphi

RE:SOLO 2 DECIMALES

Publicado por E.T. (1244 intervenciones) el 28/05/2007 18:52:54
Que tal Big, nombre. En realidad no tengo por que molestarme todos intentamos ayudar, cada uno de una forma particular, esto fue lo primero que se me vino a la mente y funciona, ya es decisión de quien pidió ayuda elegir la que mejor le parezca y/o entienda.

Algo si que no contemplé es que si das click derecho y le das pegar, y en portapapeles tenías una cadena el procedimiento falla :-p
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por yanin (1 intervención) el 07/02/2013 03:10:09
hola solo para saber si este codigo va en los edith pero en que parte???
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por RICHARD (59 intervenciones) el 31/05/2007 08:09:08
hola..
es super simple solo tienes que utilizar la funcion FormatFloat de la libreria SysUtils, que transforma un flotante a una cadena(string)

por ejmplo estos formatos..

Numero=1234,0054152

FormatFloat('0.00',Numero)=1234.00
FormatFloat('#.##',Numero)=1234
FormatFloat('#,##.00',Numero)=1,234.00

espero que te sirva...
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por R3DRUM (15 intervenciones) el 09/06/2007 01:37:15
MUCHAS GRACIAS
- Dr Juzam
- Big Luis
- E.T.
- nombre
- RICHARD

Al final lo que he hecho con los decimales es (no me ha gustado) pero creo que puede pasar:

Es una vez que salga del 'Edit' redondea el número que se le haya insertado a un número real con dos dígitos decimales:

procedure TForm1.Edit1Exit(Sender: TObject);
var
temp : real;
begin
temp := StrToFloat(Edit1.Text);
Edit1.Text := Format('%0.2f',[temp]);
end;

Bueno, lo dicho, MUCHAS GRACIAS y asta otra.

P.D.:
Lo que no me ha gustado de esta "solución", es que el usuario puede meter los dígitos que quiera hasta que llegue a completar la longitud que le he designado al 'Edit' en su propiedad "MaxLength".
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por sesan (5 intervenciones) el 20/05/2010 19:55:15
Siempre pueden hacerlo a la antigua.....

Para tomar dos o mas decimales de un real

SupCad:= floattostr(NoReal); ------------------->NoReal es el numero real a tratar
Cad1:= copy(SupCad,1,(pos(',',SupCad)-1));------>Aqui obtenemos la parte entera
Cad2:= copy(SupCad,pos(',',SupCad),4);Aqui ----->obtenemos la parte decimal
SupCad:= Cad1+Cad2;-----------------------------> Pegamos las partes
NewReal:= strtofloat(SupCad);-------------------> Nuestro Nuevo Real
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:SOLO 2 DECIMALES

Publicado por ISEKO (1 intervención) el 03/02/2016 01:30:43
Aqui sin mas complicacion en una linea, y sin redondeo, porque cuando redondeas no da los mismos valores de windows, me refiero al tamaño de un archivo.

1,64587->1,65 Windows lo pone solo 1,64


1
2
3
4
function MyRound(R:Real; Digts: byte):string;
begin
     result := copy(FloatToStr(R),1,Pos(',',FloatToStr(R))+Digts);
end;


Ejemplo:
MyRound(3.4565,2)---->3,45
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar

RE:SOLO 2 DECIMALES

Publicado por Javier Verdugo (1 intervención) el 04/06/2019 04:34:21
Después de leer tanto mensaje encontré el tuyo tan sencillo y práctico.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar