pero como le asigno un valor monetario a una hora

Iniciado por djnilo, 5 Febrero 2016, 01:50 AM

0 Miembros y 1 Visitante están viendo este tema.

djnilo

buenas noches
si me puede orientar por favor gracias estoy tratando de hacer una  aplicación de un estacionamiento

entrada y salida de vehículos

por ejemplo un auto llego 12:00 y salio 13:00 = 01:00  estuvo una hora el cobro seria $500

¿si el vehículo estuvo ejemplo llego  12:00 y salio 12:15 = estuvo 15 minutos pero igual se le cobra los $500?

otro ejemplo si el vehiculo llego 12:00 y salio 13:15 = estuvo 01:15  entoces cada 15 minutos depues de la hora deberia cobrarse $150 cada quince minutos después de la hora


¿ pero como le asigno un valor monetario a una hora ?
este es mi codigo para sumar las horas
Código (vbnet) [Seleccionar]

Dim fechaini As DateTime
       Dim fechafin As DateTime

       DateTime.TryParse(TextBox1.Text, fechaini) ' 12:00
       DateTime.TryParse(TextBox2.Text, fechafin) '13:00
     

       Dim dif As TimeSpan = fechafin - fechaini

       MsgBox("Han transcurridos " & dif.Hours & ":" & dif.Minutes & " hrs.")





XresH

Para asignarle podes usar una variable externa, la misma contiene el valor por ejemplo puede ser un array (depende de tu codigo) para mayor control de tiempos y precios.
La pregunta que haces de
"¿si el vehículo estuvo ejemplo llego  12:00 y salio 12:15 = estuvo 15 minutos pero igual se le cobra los $500?"
Eso depende del sistema que vos quieras hacer, si el mismo estacionamiento (al que le haces el sistema) quiere cobrar 15 minutos como 1 hora perfectamente podes, pero sino es asi, podes realizar una simple cuenta, regla de 3, para filtrar y cobrar acorde al tiempo establecido (por ejemplo, media hora, 250) o como te guste.

Saludos.
[ - Si eres programador y quieres que tus proyectos esten en mi blog(con o sin source), consúltame! - ]
Entra A Mi Blog De Programación | | Dudas en este post :| | >>Clic para ir al Post<<

crack81

#2
Creo que tienes un mal enfoque no necesitas asignar un valor monetario a una fecha
mira este ejemplo solo basta con hacer unas simple multiplicacion y division

Código (vbnet) [Seleccionar]

                Dim fechaini As DateTime
Dim fechafin As DateTime
Dim cobro As Integer=0

DateTime.TryParse("12:00", fechaini)
DateTime.TryParse("12:30", fechafin)

Dim dif As TimeSpan = fechafin - fechaini

If dif.Hours>=1 Then
cobro=cobro+(500*dif.Hours)

If dif.Minutes>15 Then
Dim n15min As Integer =dif.Minutes\15
cobro =cobro+n15min*150
End If

ElseIf dif.Minutes>=1 Then
cobro=500
End If


Console.WriteLine("Han transcurridos " & dif.Hours & ":" & dif.Minutes & " hrs.")
Console.WriteLine("El costo total es de "+Convert.ToString(cobro))
Console.ReadLine()


Si algo anda mal o no es lo que buscas me avisas
saludos...
Si C/C++ es el padre de los lenguajes entonces ASM es dios.

Eleкtro

#3
Cita de: crack81 en  5 Febrero 2016, 03:21 AMSi algo anda mal me avisas

Para calcular correctamente la diferencia completa entre dos intervalos de tiempo/fecha siempre se deben usar las propiedades que empiezan con el prefijo Total****, por que las propiedades que NO empiezan por Total**** lo que hacen es devolver el valor relativo al día (TimeSpan.Days), y esto causaría la obtención de valores incorrectos si intentasemos evaluar lapsos de más de 24 horas.

Esto es un ejemplo, fíjate en la diferencia:
Código (vbnet) [Seleccionar]
Dim timeDiff As TimeSpan = (TimeSpan.FromDays(2) - TimeSpan.FromDays(1)) ' 1 día de diferencia inicial.

MsgBox(timeDiff.Hours)                                 ' Valor:  "0", puesto que es la hora Cero del dia Uno.
MsgBox(timeDiff.Add(TimeSpan.FromHours(1)).Hours)      ' Valor:  "1", puesto que es la hora Uno del dia Uno.
MsgBox(timeDiff.TotalHours)                            ' Valor: "24", puesto que hay 24 horas de diferencia entre día Uno y día Dos.
MsgBox(timeDiff.Add(TimeSpan.FromHours(1)).TotalHours) ' Valor: "25", puesto que le añadí 1 hora a las 24 horas de diferencia.


...Esto lo comento por tener en cuenta el supuesto caso en el que el cliente estacionase su vehículo durante más de un día.








Teniendo esta Class para idear y personalizar la lógica de tu algoritmo:
Código (vbnet) [Seleccionar]
Public NotInheritable Class DateUtils

   ''' <summary>
   ''' Prevents a default instance of the <see cref="DateUtils"/> class from being created.
   ''' </summary>
   <DebuggerNonUserCode>
   Private Sub New()
   End Sub

   <DebuggerStepThrough>
   Public Shared Function CalculateMoney(ByVal timeIn As TimeSpan, ByVal timeOut As TimeSpan,
                                         Optional ByVal x1HourMoney As Double = 500.0F,
                                         Optional ByVal x15MinMoneyAfter1Hour As Double = 150.0F) As Double

       Dim timeDiff As TimeSpan = (timeOut - timeIn)

       Select Case (timeDiff.TotalMinutes)

           Case Is <= 0.0R
               Return 0.0R

           Case Is <= 60.0R
               Return (x1HourMoney)

           Case Else
               Dim fractions As Double = Math.Ceiling((timeDiff.TotalMinutes - 60.0R) / 15.0R)
               Dim supplement As Double = (fractions * x15MinMoneyAfter1Hour)
               Return (x1HourMoney + supplement)

       End Select

   End Function

   <DebuggerStepThrough>
   Public Shared Function CalculateMoney(ByVal dateIn As Date, ByVal dateOut As Date,
                                         Optional ByVal x1HourMoney As Double = 500.0F,
                                         Optional ByVal x15MinMoneyAfter1Hour As Double = 150.0F) As Double

       Return DateUtils.CalculateMoney(TimeSpan.FromTicks(dateIn.Ticks), TimeSpan.FromTicks(dateOut.Ticks), x1HourMoney, x15MinMoneyAfter1Hour)

   End Function

End Class


Puedes utilizarlo de las siguientes maneras (esto son solo unos ejemplos para demostrar los resultados obtenidos)
Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       Dim datePairs As New List(Of KeyValuePair(Of Date, Date)) From
           {
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("12:01")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("12:15")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:00")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:01")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:15")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:30")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:31")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("14:00"))
           }

       For Each datePair As KeyValuePair(Of Date, Date) In datePairs

           Dim sb As New StringBuilder
           With sb
               .AppendLine(String.Format("Time In  : {0}", datePair.Key.ToString("hh\:mm")))
               .AppendLine(String.Format("Time Out : {0}", datePair.Value.ToString("hh\:mm")))
               .AppendLine(String.Format("Time Diff: {0}", (datePair.Value - datePair.Key).ToString("%h\h\:%m\m")))
               .AppendLine(String.Format(CultureInfo.GetCultureInfo("en-US").NumberFormat,
                                         "Payment  : ${0:n0}", DateUtils.CalculateMoney(datePair.Key, datePair.Value)))
           End With

           Console.WriteLine(sb.ToString)

       Next

   End Sub

End Class


Código (vbnet) [Seleccionar]
   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       Dim timePairs As New List(Of KeyValuePair(Of TimeSpan, TimeSpan)) From
           {
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(12.02)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(12.25)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.0)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.02)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.25)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.5)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.52)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(14.0))
           }

       For Each timePair As KeyValuePair(Of TimeSpan, TimeSpan) In timePairs

           Dim sb As New StringBuilder
           With sb
               .AppendLine(String.Format("Time In  : {0}", timePair.Key.ToString("hh\:mm")))
               .AppendLine(String.Format("Time Out : {0}", timePair.Value.ToString("hh\:mm")))
               .AppendLine(String.Format("Time Diff: {0}", (timePair.Value - timePair.Key).ToString("%h\h\:%m\m")))
               .AppendLine(String.Format(CultureInfo.GetCultureInfo("en-US").NumberFormat,
                                         "Payment  : ${0:n0}", DateUtils.CalculateMoney(timePair.Key, timePair.Value)))
           End With

           Console.WriteLine(sb.ToString)

       Next

   End Sub

End Class


Resultado de ejecución:

Cita de: Visual StudioTime In  : 12:00
Time Out : 12:01
Time Diff: 0h:1m
Payment  : $500

Time In  : 12:00
Time Out : 12:15
Time Diff: 0h:15m
Payment  : $500

Time In  : 12:00
Time Out : 13:00
Time Diff: 1h:0m
Payment  : $500

Time In  : 12:00
Time Out : 13:01
Time Diff: 1h:1m
Payment  : $650

Time In  : 12:00
Time Out : 13:15
Time Diff: 1h:15m
Payment  : $650

Time In  : 12:00
Time Out : 13:30
Time Diff: 1h:30m
Payment  : $800

Time In  : 12:00
Time Out : 13:31
Time Diff: 1h:31m
Payment  : $950

Time In  : 12:00
Time Out : 14:00
Time Diff: 2h:0m
Payment  : $1,100

Saludos








djnilo

Cita de: crack81 en  5 Febrero 2016, 03:21 AM
Creo que tienes un mal enfoque no necesitas asignar un valor monetario a una fecha
mira este ejemplo solo basta con hacer unas simple multiplicacion y division

Código (vbnet) [Seleccionar]

                Dim fechaini As DateTime
Dim fechafin As DateTime
Dim cobro As Integer=0

DateTime.TryParse("12:00", fechaini)
DateTime.TryParse("12:30", fechafin)

Dim dif As TimeSpan = fechafin - fechaini

If dif.Hours>=1 Then
cobro=cobro+(500*dif.Hours)

If dif.Minutes>15 Then
Dim n15min As Integer =dif.Minutes\15
cobro =cobro+n15min*150
End If

ElseIf dif.Minutes>=1 Then
cobro=500
End If


Console.WriteLine("Han transcurridos " & dif.Hours & ":" & dif.Minutes & " hrs.")
Console.WriteLine("El costo total es de "+Convert.ToString(cobro))
Console.ReadLine()


Si algo anda mal o no es lo que buscas me avisas
saludos...

muchas gracias crack 81  por responder tan prontamente pero tu codigo lo hice correr
no funciona si por ejemplo pongo las 12:00 y salio 13:15 ya deberia combrarme $650
no lo hace pero si le pongo 12:00 y 13:30 cobra 800 eso esta bien


djnilo

Cita de: Eleкtro en  5 Febrero 2016, 03:44 AM
Para calcular correctamente la diferencia completa entre dos intervalos de tiempo/fecha siempre se deben usar las propiedades que empiezan con el prefijo Total****, por que las propiedades que NO empiezan por Total**** lo que hacen es devolver el valor relativo al día (TimeSpan.Days), y esto causaría la obtención de valores incorrectos si intentasemos evaluar lapsos de más de 24 horas.

Esto es un ejemplo, fíjate en la diferencia:
Código (vbnet) [Seleccionar]
Dim timeDiff As TimeSpan = (TimeSpan.FromDays(2) - TimeSpan.FromDays(1)) ' 1 día de diferencia inicial.

MsgBox(timeDiff.Hours)                                 ' Valor:  "0", puesto que es la hora Cero del dia Uno.
MsgBox(timeDiff.Add(TimeSpan.FromHours(1)).Hours)      ' Valor:  "1", puesto que es la hora Uno del dia Uno.
MsgBox(timeDiff.TotalHours)                            ' Valor: "24", puesto que hay 24 horas de diferencia entre día Uno y día Dos.
MsgBox(timeDiff.Add(TimeSpan.FromHours(1)).TotalHours) ' Valor: "25", puesto que le añadí 1 hora a las 24 horas de diferencia.


...Esto lo comento por tener en cuenta el supuesto caso en el que el cliente estacionase su vehículo durante más de un día.








Teniendo esta Class para idear y personalizar la lógica de tu algoritmo:
Código (vbnet) [Seleccionar]
Public NotInheritable Class DateUtils

   ''' <summary>
   ''' Prevents a default instance of the <see cref="DateUtils"/> class from being created.
   ''' </summary>
   <DebuggerNonUserCode>
   Private Sub New()
   End Sub

   <DebuggerStepThrough>
   Public Shared Function CalculateMoney(ByVal timeIn As TimeSpan, ByVal timeOut As TimeSpan,
                                         Optional ByVal x1HourMoney As Double = 500.0F,
                                         Optional ByVal x15MinMoneyAfter1Hour As Double = 150.0F) As Double

       Dim timeDiff As TimeSpan = (timeOut - timeIn)

       Select Case (timeDiff.TotalMinutes)

           Case Is <= 0.0R
               Return 0.0R

           Case Is <= 60.0R
               Return (x1HourMoney)

           Case Else
               Dim fractions As Double = Math.Ceiling((timeDiff.TotalMinutes - 60.0R) / 15.0R)
               Dim supplement As Double = (fractions * x15MinMoneyAfter1Hour)
               Return (x1HourMoney + supplement)

       End Select

   End Function

   <DebuggerStepThrough>
   Public Shared Function CalculateMoney(ByVal dateIn As Date, ByVal dateOut As Date,
                                         Optional ByVal x1HourMoney As Double = 500.0F,
                                         Optional ByVal x15MinMoneyAfter1Hour As Double = 150.0F) As Double

       Return DateUtils.CalculateMoney(TimeSpan.FromTicks(dateIn.Ticks), TimeSpan.FromTicks(dateOut.Ticks), x1HourMoney, x15MinMoneyAfter1Hour)

   End Function

End Class


Puedes utilizarlo de las siguientes maneras (esto son solo unos ejemplos para demostrar los resultados obtenidos)
Código (vbnet) [Seleccionar]
Public NotInheritable Class Form1 : Inherits Form

   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       Dim datePairs As New List(Of KeyValuePair(Of Date, Date)) From
           {
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("12:01")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("12:15")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:00")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:01")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:15")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:30")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("13:31")),
               New KeyValuePair(Of Date, Date)(Date.Parse("12:00"), Date.Parse("14:00"))
           }

       For Each datePair As KeyValuePair(Of Date, Date) In datePairs

           Dim sb As New StringBuilder
           With sb
               .AppendLine(String.Format("Time In  : {0}", datePair.Key.ToString("hh\:mm")))
               .AppendLine(String.Format("Time Out : {0}", datePair.Value.ToString("hh\:mm")))
               .AppendLine(String.Format("Time Diff: {0}", (datePair.Value - datePair.Key).ToString("%h\h\:%m\m")))
               .AppendLine(String.Format(CultureInfo.GetCultureInfo("en-US").NumberFormat,
                                         "Payment  : ${0:n0}", DateUtils.CalculateMoney(datePair.Key, datePair.Value)))
           End With

           Console.WriteLine(sb.ToString)

       Next

   End Sub

End Class


Código (vbnet) [Seleccionar]
   Private Sub Form1_Shown(ByVal sender As Object, ByVal e As EventArgs) _
   Handles MyBase.Shown

       Dim timePairs As New List(Of KeyValuePair(Of TimeSpan, TimeSpan)) From
           {
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(12.02)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(12.25)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.0)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.02)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.25)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.5)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(13.52)),
               New KeyValuePair(Of TimeSpan, TimeSpan)(TimeSpan.FromHours(12.0), TimeSpan.FromHours(14.0))
           }

       For Each timePair As KeyValuePair(Of TimeSpan, TimeSpan) In timePairs

           Dim sb As New StringBuilder
           With sb
               .AppendLine(String.Format("Time In  : {0}", timePair.Key.ToString("hh\:mm")))
               .AppendLine(String.Format("Time Out : {0}", timePair.Value.ToString("hh\:mm")))
               .AppendLine(String.Format("Time Diff: {0}", (timePair.Value - timePair.Key).ToString("%h\h\:%m\m")))
               .AppendLine(String.Format(CultureInfo.GetCultureInfo("en-US").NumberFormat,
                                         "Payment  : ${0:n0}", DateUtils.CalculateMoney(timePair.Key, timePair.Value)))
           End With

           Console.WriteLine(sb.ToString)

       Next

   End Sub

End Class


Resultado de ejecución:

Saludos


Muchas gracias por responder Eleкtro se nota que te manejas en el tema   pero no  entiendo tu codigo para hacerlo correr vb net  podrias explicarme por favor soy novato
me gusto eso de las 24horas como dices tu si el auto esta estacionado mas tiempo genial la idea

esta viendo las salida de tu ejemplo

por ejemplo 12:00 salio 13:01 eso es una hora y un minutos tu resultado sale $650
debiria ser $500
pero  son 12:00 salio 13:15 eso es una hora y quince minutos deberia cobra $650

Eleкtro

#6
Cita de: djnilo en  6 Febrero 2016, 04:35 AMno  entiendo tu codigo para hacerlo correr vb net  podrias explicarme por favor soy novato

Los dos ejemplos que puse son funcionales, quiero decir que solo es necesario copiar el código, pegarlo en la class principal (o donde sea), y compilarlo para testearlo. ¿Qué es lo que no entendiste para poder correrlo?.




Cita de: djnilo en  6 Febrero 2016, 04:35 AMesta viendo las salida de tu ejemplo
por ejemplo 12:00 salio 13:01 eso es una hora y un minutos tu resultado sale $650
debiria ser $500
pero  son 12:00 salio 13:15 eso es una hora y quince minutos deberia cobra $650

Entonces el algoritmo que puse debería trabajar en base a 75 minutos, no 60.

En la condición del Select Case y la condicional del Case Else debes reemplazar los minuos con los que se trabajan, simplemente reemplaza el valor 60.0R por 74.99R ( 01:14:59 hrs. ).

Una vez realizada esa modificación, este es el resultado de ejecución:
Cita de: Visual StudioTime In  : 12:00
Time Out : 12:01
Time Diff: 0h:1m
Payment  : $500

Time In  : 12:00
Time Out : 12:15
Time Diff: 0h:15m
Payment  : $500

Time In  : 12:00
Time Out : 13:00
Time Diff: 1h:0m
Payment  : $500

Time In  : 12:00
Time Out : 13:01
Time Diff: 1h:1m
Payment  : $500

Time In  : 12:00
Time Out : 13:14
Time Diff: 1h:14m
Payment  : $500

Time In  : 12:00
Time Out : 13:15
Time Diff: 1h:15m
Payment  : $650

Time In  : 12:00
Time Out : 13:16
Time Diff: 1h:16m
Payment  : $650

Time In  : 12:00
Time Out : 13:29
Time Diff: 1h:29m
Payment  : $650

Time In  : 12:00
Time Out : 13:30
Time Diff: 1h:30m
Payment  : $800

Time In  : 12:00
Time Out : 13:31
Time Diff: 1h:31m
Payment  : $800

Time In  : 12:00
Time Out : 13:44
Time Diff: 1h:44m
Payment  : $800

Time In  : 12:00
Time Out : 13:45
Time Diff: 1h:45m
Payment  : $950

Time In  : 12:00
Time Out : 13:46
Time Diff: 1h:46m
Payment  : $950

Time In  : 12:00
Time Out : 13:59
Time Diff: 1h:59m
Payment  : $950

Time In  : 12:00
Time Out : 14:00
Time Diff: 2h:0m
Payment  : $1,100

PD: La idea es que en base a ese ejemplo lo personalices por ti mismo para que devuelva los resultados deseados a tu criterio...

Saludos








Lekim

#7
Hola

Código (vbnet) [Seleccionar]
Public Class Form1

   Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
       Dim fechaini As DateTime
       Dim fechafin As DateTime


       DateTime.TryParse(TextBox1.Text, fechaini) ' 12:00
       DateTime.TryParse(TextBox2.Text, fechafin) '13:00


       Dim dif As TimeSpan = fechafin - fechaini

       Dim Precio As Integer = 0
       Dim TotalMinutos As Integer = (dif.Hours * 60 + dif.Minutes)
       If TotalMinutos < 60 Or TotalMinutos = 60 Then Precio = 500
       If TotalMinutos > 60 Then Precio = 500 + (CInt((TotalMinutos - 60) / 15)) * 150

       MsgBox(Precio)
   End Sub
End Class



Simplemente he añadido esto a tu código

Código (vbnet) [Seleccionar]
     
...
Dim Precio As Integer = 0
       Dim TotalMinutos As Integer = (dif.Hours * 60 + dif.Minutes)
       If TotalMinutos < 60 Or TotalMinutos = 60 Then Precio = 500
       If TotalMinutos > 60 Then Precio = 500 + (CInt((TotalMinutos - 60) / 15)) * 150
...

Basándome en lo que ha dicho:

por ejemplo un auto llego 12:00 y salio 13:00 = 01:00  estuvo una hora el cobro seria $500

¿si el vehículo estuvo ejemplo llego  12:00 y salio 12:15 = estuvo 15 minutos pero igual se le cobra los $500?


Lo que hago es obtener el total de minutos y establezco la condición de que si el total de minutos es menor o igual de 60 (o sea una hora) pues el Precio sea igual a 500.

Por otro lado también dices que:

entoces cada 15 minutos depues de la hora deberia cobrarse $150

Entonces establezco la condición de que si ha pasado más de una hora es decir más de 60 minutos entonces, resta 60 minutos del total que son los 500 y luego divide el resto por 15 para obtener el número de cuartos de hora.  El resultado lo multiplica por 150, ya que como has dicho cada quince minutos después de la hora se multiplica por 150.  (:-( esto me recuerda a los problemas de mates...). Finalmente suma 500 más el producto del total de cuarto de horas por 150.

Por ejemplo:
De 12:00 a 12:15   --->  es igual a 15 minutos  < 60 min.  ---> Precio = 500
De 12:00 a 13:00   --->  es igual a 60 minutos  = 60 min.  ---> Precio = 500
De 12:00 a 13:10   ----> es igual a 70 minutos > 60 min  ---> Precio = 500 + CInt((70-60)/15)*150 = 500 ... ya que 70-60 = 10 minutos y CInt(10/15) = 0 cuartos de hora.

De 12:00 a 13:30 ---> .... > 60 min.  ----> Precio = 500 + CInt((90-60)/15)*150 = 800 ya que 90-60= 30 minutos y CInt(30/15) = 2 cuartos de hora,  2 * 150= 300
y 500 + 300 = 800

(es una versión muy simplificada de la función CalculateMoney de Elektro  . Pero que conste que la vi después, eh  :laugh:)

Sl2s






djnilo

#8
Cita de: Eleкtro en  6 Febrero 2016, 11:43 AM
Los dos ejemplos que puse son funcionales, quiero decir que solo es necesario copiar el código, pegarlo en la class principal (o donde sea), y compilarlo para testearlo. ¿Qué es lo que no entendiste para poder correrlo?.




Entonces el algoritmo que puse debería trabajar en base a 75 minutos, no 60.

En la condición del Select Case y la condicional del Case Else debes reemplazar los minuos con los que se trabajan, simplemente reemplaza el valor 60.0R por 74.99R ( 01:14:59 hrs. ).

Una vez realizada esa modificación, este es el resultado de ejecución:
PD: La idea es que en base a ese ejemplo lo personalices por ti mismo para que devuelva los resultados deseados a tu criterio...

Saludos

muchas gracias por tu paciencia Eleкtro

Time In  : 12:00
Time Out : 14:00
Time Diff: 2h:0m
Payment  : $1,100
todavia me sale el mismo error de cobrar $1,100 siendo que son dos horas debería cobrar

12:00  salida 14:00 $ 1,000 y hice las modificacion que dijiste  




Cita de: Lekim en  7 Febrero 2016, 08:15 AM(es una versión muy simplificada de la función CalculateMoney)

Sl2s

He revisado tu código Lekim
muchas por contestar y por tu tiempo

funciona pero tiene un error si la entrada es  a las 12:00 y sale 14:15 $ 1250
deberia cobrar 1150




            [NOTA DEL MODERADOR]                   
No hagas doble post, utiliza el botón "MODIFICAR". 


Eleкtro

#9
Cita de: djnilo en  8 Febrero 2016, 22:38 PM
Time In  : 12:00
Time Out : 14:00
Time Diff: 2h:0m
Payment  : $1,100
todavia me sale el mismo error de cobrar $1,100 siendo que son dos horas debería cobrar

12:00  salida 14:00 $ 1,000 y hice las modificacion que dijiste  

Bueno, eso es otro problema distinto, tu dijiste que a partir de la primera hora se cobrase por cada 15 min, y eso es lo que hace el algoritmo.

Para adaptarlo una forma sería dividir los minutos transcurridos entre 60 y así obtener la cantidad de horas, multiplicar esa cantidad por $500, y evaluar los cuartos de hora restantes para añadirle ese "suplemento" adicional a la suma...

Al menos muestra un código donde lo intentes hacer por ti mismo.

Saludos!