elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Guía rápida para descarga de herramientas gratuitas de seguridad y desinfección


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)  (Leído 36,990 veces)
karmany
Colaborador
***
Desconectado Desconectado

Mensajes: 1.603


Sueñas que sueñas


Ver Perfil WWW
Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)
« en: 3 Junio 2010, 20:39 pm »

Hola.

Estoy utilizando el DataReport conectado a una base de datos.
Tengo un campo que lo he definido en la base de datos como single(coma flotante, precisión simple).

Si el número es(las comas son los decimales): 3,346 puedo previsualizarlo en el DataReport de dos formas:
1) 3,346 que es sin dar ningún formato
2) 3,35 que es dando formato con dos decimales.

Para conseguir esta segunda forma, basta con poner la propiedad format así: "0.00"

El código para el que esté interesado es simplemente éste:
Código
  1. Dim Formato As New StdDataFormat
  2. Formato.Format = "0.00"
  3. Set Sections("detalle").Controls("Texto4").DataFormat = Formato

Mi pregunta es:
Quiero conseguir que el DataReport me muestre solamente 3,34, sin redondeo. ¿Existe alguna forma de poner este formato con "Format"?
Os puedo asegurar que he probado de todo: "##.##", "##.#0". No se me ocurre nada más...

A ver si alguien sabe hacerlo.

PD. Es una pena, pero si no se puede hacer con format, la solución será crear un nuevo campo de texto en la base de datos y manejar ese valor....
Muchas gracias


« Última modificación: 4 Junio 2010, 02:12 am por karmany » En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.144


I'Love...!¡.


Ver Perfil WWW
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?
« Respuesta #1 en: 3 Junio 2010, 20:46 pm »


Lo que pides es .Net

Te voy a responder en VB 6.0

FormatNumber();

Código:

Function FormatNumber(Expression, [NumDigitsAfterDecimal As Long = -1], [IncludeLeadingDigit As VbTriState = vbUseDefault], [UseParensForNegativeNumbers As VbTriState = vbUseDefault], [GroupDigits As VbTriState = vbUseDefault]) As String
    Miembro de VBA.Strings
    Formats expression as number


Donde los parametros entre Corchetes son Opcionales!¡.

Código
  1.  
  2. Private Sub Text1_Change()
  3.    Text1.Text = FormatNumber(Text1.Text, 2)
  4. End Sub
  5.  
  6.  

Dulce Infierno Lunar!¡.


En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
karmany
Colaborador
***
Desconectado Desconectado

Mensajes: 1.603


Sueñas que sueñas


Ver Perfil WWW
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?
« Respuesta #2 en: 3 Junio 2010, 20:56 pm »

Estoy utilizando VB6.

Voy a ver si puedo hacer algo con FormatNumber.
La verdad que no lo sé porque en un DataReport no existe el evento text4_Change.

La única opción de ponerle formato es mediante la propiedad format, tal como lo he hecho arriba en el evento DataReport_Initialize. No sé, voy a ver si puedo usar FormatNumber con Format.

Gracias
En línea

karmany
Colaborador
***
Desconectado Desconectado

Mensajes: 1.603


Sueñas que sueñas


Ver Perfil WWW
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?
« Respuesta #3 en: 4 Junio 2010, 02:12 am »

Después de buscar y rebuscar y de probar he encontrado la solución.
Primeramente decir que no he encontrado ninguna función en VB que trunque los decimales. Ni FormatNumber, ni Format, ni Round ni ninguna otra funcionan, así que he tenido que convertir el número en cadena y después trabajar con él.

Pongo el código para ver si a alguien le puede ayudar:

Código
  1. Option Explicit
  2. Dim WithEvents formato As StdDataFormat
  3.  
  4. Private Sub DataReport_Initialize()
  5.    Set formato = New StdDataFormat
  6.    Set Sections("detalle").Controls("Texto4").DataFormat = formato
  7. End Sub
  8.  
  9. Private Sub formato_Format(ByVal DataValue As StdFormat.StdDataValue)
  10.    Dim i As Integer, cadena As String
  11.    cadena = DataValue.Value
  12.    i = InStr(cadena, ",")
  13.    If i Then DataValue.Value = Left(cadena, i + 2)
  14. End Sub
En línea

Dreamaker

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)
« Respuesta #4 en: 5 Junio 2010, 22:20 pm »

No se si es lo que buscabas, pero para truncar a 2 decimales es tan simple como:

Código
  1. Private Sub cmdTruncar_Click()
  2.  
  3. Dim sngNumero As Single
  4.  
  5. sngNumero = Val(txtValor1.Text) 'Se le asigna el valor del numero que contiene el textbox
  6.  
  7. lblResultado.Caption = (Fix(sngNumero * 100)) / 100 'Se lo trunca a 2 cifras
  8.  
  9. End Sub

O si quieres truncar a n cantidad de cifras ingresadas por el usuario (2 cifras, por ej), es tan simple como:

Código
  1. Private Sub cmdTruncar_Click()
  2.  
  3. Dim sngNumero As Single, sngDecimal As Byte
  4.  
  5. sngNumero = Val(txtValor1.Text) 'Es el numero ingresado al que quiere que sea truncado
  6.  
  7. sngDecimal = Val(txtValor2.Text) 'Se le asigna el valor del textbox que es lo que ingresará el usuario de n cifras a redondear
  8.  
  9. lblResultado.Caption = (Fix(sngNumero * (10 ^ sngDecimal))) / (10 ^ sngDecimal) 'Truncamiento
  10.  
  11. End Sub

Espero si esto es lo que buscabas, de una manera más rapida y sencilla, que te haya servido :D
« Última modificación: 5 Junio 2010, 22:23 pm por Dreamaker » En línea

Karcrack


Desconectado Desconectado

Mensajes: 2.419


Se siente observado ¬¬'


Ver Perfil
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)
« Respuesta #5 en: 6 Junio 2010, 03:28 am »

 :huh:
Código
  1. MsgBox "Soy un número con dos decimales " & Format$(112.01298, "#.##")
O directamente con la funcion FormatNumber(), pero si no me equivoco acaba llamando a Format() :P
« Última modificación: 6 Junio 2010, 03:30 am por Karcrack » En línea

Dreamaker

Desconectado Desconectado

Mensajes: 277



Ver Perfil
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)
« Respuesta #6 en: 6 Junio 2010, 21:12 pm »

:huh:
Código
  1. MsgBox "Soy un número con dos decimales " & Format$(112.01298, "#.##")
O directamente con la funcion FormatNumber(), pero si no me equivoco acaba llamando a Format() :P

Como sabrás Karcrack no soy partidario de usar funciones del VB, sino crear mis propias funciones (y saberlo hacer) sea en el lenguaje que sea :¬¬
En línea

karmany
Colaborador
***
Desconectado Desconectado

Mensajes: 1.603


Sueñas que sueñas


Ver Perfil WWW
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)
« Respuesta #7 en: 11 Junio 2010, 20:49 pm »

Gracias Dreamaker por la ayuda. Al final sigo utilizando la mía que no falla.

He probado tu ejemplo pero no siempre funciona.
Por ejemplo, a dos decimales:


INICIAL         FINAL
=====================
3.123    -->    3,12   Correcto
3.128    -->    3,12   Correcto
3.12     -->    3,11   No correcto
3.19     -->    3,19   Correcto
3.002    -->    3      Correcto
3.009    -->    3      Correcto
3.03     -->    3,02   No correcto
3.09     -->    3,08   No correcto
3.2      -->    3,2    Correcto
3.9      -->    3,9    Correcto


He probado tu ejemplo con la función CSng en vez de Val, pero hace lo mismo. Pienso que la solución es manejar la cantidad como una String.
« Última modificación: 11 Junio 2010, 21:04 pm por karmany » En línea

BlackZeroX (Astaroth)
Wiki

Desconectado Desconectado

Mensajes: 3.144


I'Love...!¡.


Ver Perfil WWW
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)
« Respuesta #8 en: 11 Junio 2010, 23:02 pm »

Código
  1.  
  2. Option Explicit
  3.  
  4. Sub main()
  5. Dim indexAux        As Integer
  6. Const expression    As String = "10000.1351465465465768"
  7.    Debug.Print Strings.String(10, "-"); "SplitFormatNumbericVB"
  8.    For indexAux = 5 To -1 Step -1
  9.        Debug.Print SplitFormatNumbericVB(expression, indexAux)
  10.    Next
  11.    Debug.Print Strings.String(10, "-"); "MathFormatNumbericVB"
  12.    For indexAux = 5 To -1 Step -1
  13.        Debug.Print MathFormatNumbericVB(expression, indexAux)
  14.    Next
  15. End Sub
  16.  
  17.  


Código
  1.  
  2. '
  3. '   /////////////////////////////////////////////////////////////
  4. '   // Autor:   BlackZeroX ( Ortega Avila Miguel Angel )       //
  5. '   //                                                         //
  6. '   // Web:     http://InfrAngeluX.Sytes.Net/                  //
  7. '   //                                                         //
  8. '   //    |-> Pueden Distribuir Este Codigo siempre y cuando   //
  9. '   // no se eliminen los creditos originales de este codigo   //
  10. '   // No importando que sea modificado/editado o engrandesido //
  11. '   // o achicado, si es en base a este codigo es requerido    //
  12. '   // el agradacimiento al autor.                             //
  13. '   /////////////////////////////////////////////////////////////
  14. '
  15.  
  16. Option Explicit
  17.  
  18. Public Function SplitFormatNumbericVB(ByVal expression As String, Optional ByVal NumDigitsAfterDecimal As Long = -1) As String
  19. Dim SpliNumeric()           As String
  20. Dim Longitud                As Long
  21.  
  22.    If Information.IsNumeric(expression) Then
  23.        If Not NumDigitsAfterDecimal <= -1 Then
  24.            expression = Strings.Replace(expression, ",", ".")
  25.            SpliNumeric = Strings.Split(expression, ".", -1, vbBinaryCompare)
  26.            SplitFormatNumbericVB = SpliNumeric(0)
  27.            If Not NumDigitsAfterDecimal = 0 Then
  28.                If UBound(SpliNumeric) = 1 Then
  29.                    Longitud = NumDigitsAfterDecimal - Strings.Len(SpliNumeric(1))
  30.                    If Longitud > 0 Then
  31.                        SpliNumeric(1) = SpliNumeric(1) & Strings.String$(Longitud, "0")
  32.                    End If
  33.                    SplitFormatNumbericVB = SplitFormatNumbericVB & "." & Strings.Mid(SpliNumeric(1), 1, NumDigitsAfterDecimal)
  34.                End If
  35.            End If
  36.        Else
  37.            SplitFormatNumbericVB = expression
  38.        End If
  39.    End If
  40. End Function
  41.  
  42. Public Function MathFormatNumbericVB(ByVal Expression As String, Optional ByVal NumDigitsAfterDecimal As Long = -1) As String
  43. Dim PotenciaDecimal         As Double
  44. Dim DecFaltantes            As Long
  45.    If Information.IsNumeric(Expression) Then
  46.        If Not NumDigitsAfterDecimal < 0 Then
  47.            PotenciaDecimal = (10 ^ NumDigitsAfterDecimal)
  48.            Expression = Strings.Replace(Expression, ",", ".")
  49.            MathFormatNumbericVB = Strings.Split(Expression * PotenciaDecimal, ".")(0) / PotenciaDecimal
  50.            DecFaltantes = NumDigitsAfterDecimal - (Strings.Len(MathFormatNumbericVB) - Strings.InStr(1, MathFormatNumbericVB, ".", vbBinaryCompare))
  51.            If DecFaltantes > 0 Then
  52.                MathFormatNumbericVB = MathFormatNumbericVB & Strings.String$(DecFaltantes, "0")
  53.            End If
  54.        Else
  55.            MathFormatNumbericVB = Expression
  56.        End If
  57.    End If
  58. End Function
  59.  
  60.  

Dulce Infierno Lunar!¡.
« Última modificación: 11 Junio 2010, 23:21 pm por BlackZeroX▓▓▒▒░░ » En línea




CScript (Actualizado 26/06/2013).

FileX <-- Re-modelando...
Web Principal-->[ Blog(VB6/C/C++) | Host File | Scan Port) ]

The Dark Shadow is my passion.
El infierno es mi Hogar, mi novia es Lilit y el metal mi relig
fabianmoyata

Desconectado Desconectado

Mensajes: 1


Ver Perfil
Re: Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado)
« Respuesta #9 en: 18 Marzo 2018, 03:33 am »

Si claro, existen muchas formas de obtener el mismo resultado. Tanto en vb6 como en vb.net, yo lo haría así:

Código:

    Function SinDecimales(ByVal NumDob As Double, ByVal CanDec As Integer) As Double

        Dim B As Integer

        B = Int(NumDob * 10 ^ CanDec)

        SinDecimales = B / 10 ^ CanDec

    End Function


Ejemplo de uso de la función asumiendo un formulario con los siguientes objetos:

Cajas de texto
txtCanDec, para establecer la cantidad de decimales
txtNumero, donde se registra el número
txtResultado, donde se muestra el resultado

Botón.
btnCalcular

Código:
    Private Sub btnCalcular_Click(sender As Object, e As EventArgs) Handles btnCalcular.Click
        Me.txtResultado.Text = SinDecimales(Me.txtNumero.Text, Me.txtCanDec.Text)
    End Sub


De esta manera se puede obtener el mismo resultado.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[Solucionado]Duda con decimales
Programación Visual Basic
Trane! 4 1,761 Último mensaje 13 Julio 2011, 02:23 am
por Trane!
[Ayuda] Redondeo en C++
Programación C/C++
Zodiak98 7 2,449 Último mensaje 4 Agosto 2014, 23:18 pm
por leosansan
Evitar redondeo de decimales en textbox
Programación Visual Basic
rapbyone 7 5,744 Último mensaje 12 Febrero 2015, 17:32 pm
por okik
Como quitar decimales en java?
Java
Angel wing 1 2,078 Último mensaje 21 Octubre 2017, 00:16 am
por Orubatosu
Sctipt redondeo en caja
Programación C/C++
Mechanix318 2 921 Último mensaje 27 Noviembre 2017, 17:57 pm
por Mechanix318
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines