Autor
|
Tema: Format - ¿Cómo conseguir 2 decimales SIN redondeo?(Solucionado) (Leído 43,534 veces)
|
karmany
|
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: Dim Formato As New StdDataFormat Formato.Format = "0.00" 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
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
Lo que pides es .Net Te voy a responder en VB 6.0 FormatNumber(); 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!¡. Private Sub Text1_Change() Text1.Text = FormatNumber(Text1.Text, 2) End Sub
Dulce Infierno Lunar!¡.
|
|
|
En línea
|
The Dark Shadow is my passion.
|
|
|
karmany
|
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
|
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: Option Explicit Dim WithEvents formato As StdDataFormat Private Sub DataReport_Initialize() Set formato = New StdDataFormat Set Sections("detalle").Controls("Texto4").DataFormat = formato End Sub Private Sub formato_Format(ByVal DataValue As StdFormat.StdDataValue) Dim i As Integer, cadena As String cadena = DataValue.Value i = InStr(cadena, ",") If i Then DataValue.Value = Left(cadena, i + 2) End Sub
|
|
|
En línea
|
|
|
|
Dreamaker
Desconectado
Mensajes: 277
|
No se si es lo que buscabas, pero para truncar a 2 decimales es tan simple como: Private Sub cmdTruncar_Click() Dim sngNumero As Single sngNumero = Val(txtValor1.Text) 'Se le asigna el valor del numero que contiene el textbox lblResultado.Caption = (Fix(sngNumero * 100)) / 100 'Se lo trunca a 2 cifras End Sub
O si quieres truncar a n cantidad de cifras ingresadas por el usuario (2 cifras, por ej), es tan simple como: Private Sub cmdTruncar_Click() Dim sngNumero As Single, sngDecimal As Byte sngNumero = Val(txtValor1.Text) 'Es el numero ingresado al que quiere que sea truncado sngDecimal = Val(txtValor2.Text) 'Se le asigna el valor del textbox que es lo que ingresará el usuario de n cifras a redondear lblResultado.Caption = (Fix(sngNumero * (10 ^ sngDecimal))) / (10 ^ sngDecimal) 'Truncamiento End Sub
Espero si esto es lo que buscabas, de una manera más rapida y sencilla, que te haya servido
|
|
« Última modificación: 5 Junio 2010, 22:23 pm por Dreamaker »
|
En línea
|
|
|
|
Karcrack
Desconectado
Mensajes: 2.416
Se siente observado ¬¬'
|
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()
|
|
« Última modificación: 6 Junio 2010, 03:30 am por Karcrack »
|
En línea
|
|
|
|
Dreamaker
Desconectado
Mensajes: 277
|
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() 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
|
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
Wiki
Desconectado
Mensajes: 3.158
I'Love...!¡.
|
Option Explicit Sub main() Dim indexAux As Integer Const expression As String = "10000.1351465465465768" Debug.Print Strings.String(10, "-"); "SplitFormatNumbericVB" For indexAux = 5 To -1 Step -1 Debug.Print SplitFormatNumbericVB(expression, indexAux) Next Debug.Print Strings.String(10, "-"); "MathFormatNumbericVB" For indexAux = 5 To -1 Step -1 Debug.Print MathFormatNumbericVB(expression, indexAux) Next End Sub
' ' ///////////////////////////////////////////////////////////// ' // Autor: BlackZeroX ( Ortega Avila Miguel Angel ) // ' // // ' // Web: http://InfrAngeluX.Sytes.Net/ // ' // // ' // |-> Pueden Distribuir Este Codigo siempre y cuando // ' // no se eliminen los creditos originales de este codigo // ' // No importando que sea modificado/editado o engrandesido // ' // o achicado, si es en base a este codigo es requerido // ' // el agradacimiento al autor. // ' ///////////////////////////////////////////////////////////// ' Option Explicit Public Function SplitFormatNumbericVB(ByVal expression As String, Optional ByVal NumDigitsAfterDecimal As Long = -1) As String Dim SpliNumeric() As String Dim Longitud As Long If Information.IsNumeric(expression) Then If Not NumDigitsAfterDecimal <= -1 Then expression = Strings.Replace(expression, ",", ".") SpliNumeric = Strings.Split(expression, ".", -1, vbBinaryCompare) SplitFormatNumbericVB = SpliNumeric(0) If Not NumDigitsAfterDecimal = 0 Then If UBound(SpliNumeric) = 1 Then Longitud = NumDigitsAfterDecimal - Strings.Len(SpliNumeric(1)) If Longitud > 0 Then SpliNumeric(1) = SpliNumeric(1) & Strings.String$(Longitud, "0") End If SplitFormatNumbericVB = SplitFormatNumbericVB & "." & Strings.Mid(SpliNumeric(1), 1, NumDigitsAfterDecimal) End If End If Else SplitFormatNumbericVB = expression End If End If End Function Public Function MathFormatNumbericVB(ByVal Expression As String, Optional ByVal NumDigitsAfterDecimal As Long = -1) As String Dim PotenciaDecimal As Double Dim DecFaltantes As Long If Information.IsNumeric(Expression) Then If Not NumDigitsAfterDecimal < 0 Then PotenciaDecimal = (10 ^ NumDigitsAfterDecimal) Expression = Strings.Replace(Expression, ",", ".") MathFormatNumbericVB = Strings.Split(Expression * PotenciaDecimal, ".")(0) / PotenciaDecimal DecFaltantes = NumDigitsAfterDecimal - (Strings.Len(MathFormatNumbericVB) - Strings.InStr(1, MathFormatNumbericVB, ".", vbBinaryCompare)) If DecFaltantes > 0 Then MathFormatNumbericVB = MathFormatNumbericVB & Strings.String$(DecFaltantes, "0") End If Else MathFormatNumbericVB = Expression End If End If End Function
Dulce Infierno Lunar!¡.
|
|
« Última modificación: 11 Junio 2010, 23:21 pm por BlackZeroX▓▓▒▒░░ »
|
En línea
|
The Dark Shadow is my passion.
|
|
|
fabianmoyata
Desconectado
Mensajes: 1
|
Si claro, existen muchas formas de obtener el mismo resultado. Tanto en vb6 como en vb.net, yo lo haría así: 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 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
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
[Solucionado]Duda con decimales
Programación Visual Basic
|
Trane!
|
4
|
2,941
|
13 Julio 2011, 02:23 am
por Trane!
|
|
|
[Ayuda] Redondeo en C++
Programación C/C++
|
Zodiak98
|
7
|
4,135
|
4 Agosto 2014, 23:18 pm
por leosansan
|
|
|
Evitar redondeo de decimales en textbox
Programación Visual Basic
|
rapbyone
|
7
|
8,543
|
12 Febrero 2015, 17:32 pm
por okik
|
|
|
Como quitar decimales en java?
Java
|
Angel wing
|
1
|
4,347
|
21 Octubre 2017, 00:16 am
por Orubatosu
|
|
|
Sctipt redondeo en caja
Programación C/C++
|
Mechanix318
|
2
|
2,032
|
27 Noviembre 2017, 17:57 pm
por Mechanix318
|
|