Visual Basic Foro
Programación => Visual Basic 6 => Mensaje iniciado por: E N T E R en Diciembre 18, 2012, 04:41:55 pm
-
Necesito convertir de unidad a pack.
1 Pack = 12 unidades.
Private Sub Command1_Click()
Dim xEntero As Integer
Dim xUnidad As Integer
xEntero = Format(Val(Text1.Text) / 12, "")
xUnidad = Format(Val(Text1.Text), "") - xEntero * 12
If xUnidad > 0 Then
Debug.Print xEntero & " PACK CON " & xUnidad & " LATAS"
Else
Debug.Print xEntero & " PACK"
End If
End Sub
En algunos casos no me convierte bien, por ejemplo si pongo 69 unidad me tira directo a 6 pack, y deberia de ser 5 pack con 9 latas.
-
El problema es que estas poniendo xEntero como Integer cuando 69/12 = 5.75
Dim xEntero As Double
Dim xUnidad As Integer
xEntero = Fix((Val(Text1.Text)) / 12)
xUnidad = (Val(Text1.Text) / 12 - xEntero) * 12
If xUnidad > 0 Then
Debug.Print xEntero & " PACK CON " & xUnidad & " LATAS"
Else
Debug.Print xEntero & " PACK"
End If
-
Así mismo amigo me equivoque ahí también lo resolví así:
Dim xEntero As Double
Dim xUnidad As Double
Dim xTotal As Double
Private Sub Command1_Click()
xEntero = (Text1.Text) / 12
xUnidad = Int(xEntero)
xTotal = Int(Text1.Text) - (xUnidad) * 12
If Text1.Text < 12 Then
Me.Caption = Text1.Text & " LATAS"
Else
If xTotal > 0 Then
Me.Caption = xUnidad & " PACK CON " & xTotal & " LATAS"
Else
Me.Caption = xUnidad & " PACK"
End If
End If
End Sub
-
Creo que Fix redondea para arriba, por lo que si pones 23 latas, en ves de ponerte 1 pack con 11 latas, te pondria 2 packs.... (1.9 packs)
En realidad debe ser así
Const latasXpack As Integer = 12
Dim unidades As Integer, Packs As Integers, latasRestantes As Integer
Packs = Floor(unidades / latasXpack)
latasRestantes = unidades - Packs * latasXpack
Y listo :)
-
Floor?
Dim xNumero As Double
Dim xCaja As Integer
xNumero = Val(Text1.Text) 'Numero a comparar
xCaja = 12 'Cantidad que contiene el PACK
If xNumero < xCaja Then
lblMen.Caption = xNumero & " LATAS"
Else
'Metodo 1-------------------------------------------
Dim xEntero As Double
Dim xDecimales As Double
xEntero = Format((xNumero / xCaja), "####0.00")
xDecimales = Format((xEntero - Int(xEntero)) * xCaja, "####0")
xEntero = Int(xEntero)
'Metodo 2-------------------------------------------
'Dim xEntero As Integer
'Dim xDecimales As Integer
'xEntero = Int(xNumero / xCaja)
'xDecimales = xNumero - (xEntero * xCaja)
'---------------------------------------------------
If xDecimales > 0 Then
lblMen.Caption = xEntero & " PACK CON " & xDecimales & " LATAS"
Else
lblMen.Caption = xEntero & " PACK"
End If
End If
-
Floor es una funcion que redondea hacia abajo, o sea, 3.5, 3.7, 3.9, 3.1 y así se redondea a 3....
No hay forma de que 23.9 latas te den 2 paquetes, es 1 paquete y 11.9 latas :P (una exageración, pero se entiende)
-
La verdad tambien me sono a que Vb no tenia esa funcion. investigando encontre esto.
Ceiling y Floor en VB6
Dado que Visual Basic 6 carece de estos dos métodos que en algún momento pueden resultar útiles. Una forma de obtener el resultado deseado es con dos pequeñas funciones.
'Devuelve el entero más pequeño no menor que X.
'Ejemplo: Ceiling(1.23) = 2, Ceiling(-1.23) = -1
Private Function Ceiling(ByVal X As Double) As Long
Ceiling = -Int(X * (-1))
End Function
'Devuelve el entero más grande no mayor que X.
'Ejemplo: Floor(1.23) = 1, Floor(-1.23) = -2
Private Function Floor(ByVal X As Double) As Long
Floor = (-Int(X) * (-1))
End Function
Pero gracias por todo y a todos por colaborar, ya lo resolvi.
-
Creo que Fix redondea para arriba, por lo que si pones 23 latas, en ves de ponerte 1 pack con 11 latas, te pondria 2 packs.... (1.9 packs)
En realidad debe ser así....
No mi estimado, el codigo que puse es correcto, con 23 latas o cualquier cantidad de latas me da el resultado esperado, fijate:
[youtube]http://www.youtube.com/watch?v=6MvwOejs9WQ[/youtube]
Poner en HD debes!!! Salud
-
esta forma creo que tambien es valida
xEntero = Val(Text1.Text) \ 12
xUnidad = Val(Text1.Text) Mod 12
-
Esa es mas limpia, cambiar de:
xEntero = Fix((Val(Text1.Text)) / 12)
xUnidad = (Val(Text1.Text) / 12 - xEntero) * 12
a
xEntero = Fix((Val(Text1.Text)) / 12)
xUnidad = Val(Text1.Text) Mod 12
-
xEntero = Val(Text1.Text) \ 12 '<--Parte entera
xUnidad = Val(Text1.Text) Mod 12'<--Resto
-
xEntero = Val(Text1.Text) \ 12 '<--Parte entera
xUnidad = Val(Text1.Text) Mod 12'<--Resto
Ya me di cuenta!!!! no sabia eso realmente. Pense que era un error pero comprobé que efectivamente funciona, y el truco esta en usar \ en vez de /. A pesar de que funciona bien con Fix, no es necesario usarlo.