Pregunta

Estoy tratando de hacer una cierta cadena con el formulario de cambio de dígitos, de modo que se vea a continuación.

modificado para mostrar con dígitos en lugar de x.

así que estemos estableciendo, obtengo un número, como este.

234.123123123

Necesito cambiar cómo aparece, por 3 dígitos antes de un punto, tendría que convertirse.

0.234123123123

y digamos que es 2.23123123123, eso se convertiría en, 0.0023123123123

ahora intentaré explicar la fórmula, desnuda con mi inglés.

La fórmula necesita cambiar la posición del punto ".". Puedes ver que cambia el lugar, pero también puedes ver que estoy agregando 0s.

Eso es importante, las 0as deben agregarse si el punto obtenga a la izquierda (el comienzo de la cadena).

Entonces, ¿cuánto debe mover el punto?

El punto debe mover siempre 3 pasos a la izquierda.

y si golpeó la pared (el inicio de la cadena) necesita agregar 0s, y luego uno 0s antes del punto.

Entonces, si el número es, 2.222222 Primero tendré que mover el punto a la izquierda, vamos a mostrar paso a paso.

Step 1:
.2222222

Step 2:
.02222222

Step 3:
0.02222222

Siempre debe ser un 0 antes del punto, nunca llegó al inicio.

Suena más complicado, entonces es, es decir, no sé cómo explicarlo.

Editar:

Mi intento:

      TextPos = InStr(1, TextBox4.Value, ".") - 2
If (TextPos = 4) Then
     sLeft = Left(TextBox4.Value, Len(TextBox4.Value) - Len(TextBox4.Value) + 2)
      sRight = Right(TextBox4.Value, Len(TextBox4.Value) - 2)
      sFinal = (sLeft & "." & Replace(sRight, ".", ""))
      TextBox4.Value = Replace(sFinal, "-", "")
      End If
If (TextPos = 3) Then
      TextBox4.Value = "0." + Replace(TextBox4.Value, ".", "")
      End If
If (TextPos = 2) Then
      TextBox4.Value = "0.0" + Replace(TextBox4.Value, ".", "")
End If
If (TextPos = 1) Then
      TextBox4.Value = "0.00" + Replace(TextBox4.Value, ".", "")
End If
TextBox4.Value = Replace(TextBox4.Value, "-", "")

Si I / 1000 IT, puede funcionar, pero parece que alterará el número, dejándolo fallar.

Original: 25.1521584671082

/1000 : 2.51521584671082E-02

Como puede ver, no funciona como se esperaba.

Debe convertirse en 0.0251521584671082E-02 (y, por supuesto, no quiero "e-" estar allí. Entonces, si es posible hacer esto, pero solo en movimiento y en realidad, dividiendo (creo que Excel se limita a la cantidad de números con la que puede calcular), funcionará.

Vale la pena señalar, los números mostrados son en realidad menos (más cortos), entonces el número real por alguna razón, si lo escribo a un archivo de texto, se convierte en esto:

2.51521584671082e-02251521584671082e-02

Como puede ver, probablemente golpee una pared en el cálculo, por lo que cambia a los personajes (sé que las matemáticas usan aquellas, pero no tienen idea de lo que significan, y son inútiles para mí de todos modos).

y creo que es debido a ellos que falla, no estoy seguro de.

Editar:

De acuerdo, al limitar a 15 decimales, devolverá el lugar correcto, pero me gustaría que no hiciera esta ronda, debería sobresalir realmente se limitará a solo 15 decimales, o es "doble, flotante, etc." que hace esto ?

Editar 2:

El ejemplo de

Tony proporciona esto:

Original: 177.582010543847177582010543847
Tony's: 0.1775820110177582011
Round(15decimals): 0.1775820105438470177582010543847

No estoy realmente seguro, pero ¿no es incorrecto, o tal vez hice algo mal?

Si es posible, quiero que todos los decimales y el número permanezcan en su lugar, ya que todo es correcto, es solo que están en el lugar equivocado.

/ 1000 resuelve esto, pero no de la mejor manera, ya que recalculará en lugar de simplemente moverse. Normalmente no me importaría, los resultados son los mismos, pero aquí está importar lo que puede ver.

Puedo pensar en una solución, donde l que busco la posición del punto, luego recorte los últimos decimales, divida el resultado en 1000, luego agregue los últimos decimales, aunque es más un truco, No estoy seguro si realmente funcionará.

Concluyo que esto se responde, hace lo que quiero, y las limitaciones están en el cálculo en sí, no la solución. Todas las soluciones funcionan bastante de la misma manera, pero elegí Tony, ya que fue el primero en comentar la solución en mi pregunta.

muchas gracias a todos!

¿Fue útil?

Solución

Tu código a veces falla porque no maneja todas las situaciones. Usted calcula los puntos de texto SO:

TextPos = InStr(1, TextBox4.Value, ".") - 2

Luego, maneja los puntos de texto 4, 3, 2 o 1., pero si, por ejemplo, textbox4.value="2.22222" luego textpos= 0 y no tiene código para esa situación.

a las 11:45 GMT, sugerí que en un comentario que se divide por 1000 le daría el resultado que buscas. A las 14:08 GMT, Tunderblaster publicó esto como una respuesta. Ahora es 15:23 pero no ha respondido a ninguno de nosotros.

Habiendo intentado su código, ahora sé que estas respuestas no coinciden con el resultado que le da cuando funciona porque elimina el letrero. Lo siguiente le daría casi lo mismo que una versión de trabajo de su código:

TextBox4.Value = Format(Abs(Val(TextBox4.Value)) / 1000, "#,##0.#########")

La única deficiencia con esta declaración es que no preserva todos los dígitos decimales que se arrastran. ¿Es esto realmente importante?

Mientras estaba preparando y publicando esta respuesta, editó su pregunta para indicar que la división en 1000 a veces daría el resultado en formato científico. Mi solución evita ese problema.

Otros consejos

Me parece a través de todas sus ediciones que desea dividir el número por mil.Para hacer esto, simplemente puede usar

TextBox4.Value = TextBox4.Value / 1000

Si desea evitar el error de punto flotante cuando se divide por 10, puede usar el tipo Decimal

Private Sub CommandButton1_Click()
    Dim d As Variant
    d = CDec(TextBox1.Text)
    TextBox1.Text = d / 1000
End Sub

¿Es esto lo que estás intentando?

Sub Sample()
    Dim sNum As String, SFinal As String
    Dim sPref  As String, sSuff As String
    Dim nlen As Long

    sNum = "234.123123123123123123131231231231223123123"

    SFinal = sNum

    If InStr(1, sNum, ".") Then
        sPref = Trim(Split(sNum, ".")(0))
        sSuff = Trim(Split(sNum, ".")(1))
        nlen = Len(sPref)

        Select Case nlen
            Case 1: SFinal = ".00" & Val(sPref) & sSuff
            Case 2: SFinal = ".0" & Val(sPref) & sSuff
            Case 3: SFinal = "." & Val(sPref) & sSuff
        End Select
    End If

    Debug.Print SFinal
End Sub

Intenta esto.Funciona mediante el relleno inicialmente de la cadena con los principales generadores de generación, cambiando el DP, y luego eliminando cualquier innensario.

Function ShiftDecimalInString(str As String, Places As Long) As String
    Dim i As Long
    If Places > 0 Then
        ' Move DP to left
        '  Pad with leading 0's
        str = Replace$(Space$(Places), " ", "0") & str

        ' Position of .
        i = InStr(str, ".")
        str = Replace$(str, ".", "")

        If i > 0 Then
            ' Shift . to left
            str = Left$(str, i - Places - 1) & "." & Mid$(str, i - Places)

            ' strip unnecassary leading 0's
            Do While Left$(str, 2) = "00"
                str = Mid$(str, 2)
            Loop
            If str Like "0[!.]*" Then
                str = Mid$(str, 2)
            End If

            ShiftDecimalInString = str
        Else
            ' No . in str
            ShiftDecimalInString = str
        End If
    ElseIf Places < 0 Then
        ' ToDo: Handle moving DP to right
    Else
        ' shift DP 0 places
        ShiftDecimalInString = str
    End If
End Function

Esta "respuesta" respuestas al problema que desea la mayor precisión posible en el resultado posible.

Cuando estaba en la escuela, esto se llamaba exactitud espuria.He olvidado la mayoría de mis matemáticas en esta área, pero trataré de darle una comprensión del problema.

Tengo un valor, 2.46, que es preciso a 2 lugares decimales.Ese es el verdadero valor en algún lugar del rango 2.455 a 2.465.

Si alimento estos valores en una función de raíz cuadrada, obtendré:

sqrt(2.455) = 1.566843961599240
sqrt(2.46)  = 1.568438714135810
sqrt(2.465) = 1.570031846810760

de esto veo la raíz cuadrada del valor real es en algún lugar entre 1.567 y 1.570;Cualquier dígito extra decimal es espurio.

Si entiendo correctamente, desea utilizar estos números para realizar ajustes.¿Eres capaz de realizar ajustes a 15 dígitos decimales?

Si recuerda su cálculo, puede buscar "la profecación de error" para obtener una mejor explicación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top