Pergunta

Estou tentando fazer uma determinada string com dígitos alterar o formulário, para que fique como abaixo.

Modificado para mostrar dígitos em vez de X.

Então vamos definir, eu recebo um número, assim.

234.123123123

Preciso mudar a forma como aparece, para 3 dígitos antes de um Ponto, precisaria ficar.

0.234123123123

E digamos que seja 2,23123123123, isso se tornaria 0,0023123123123

Agora vou tentar explicar a Fórmula, com meu inglês.

A fórmula precisa alterar a posição do ponto ".".Você pode ver que ele muda de lugar, mas também pode ver que estou adicionando 0s.

Isso é importante, os 0s precisam ser adicionados SE o ponto estiver na extrema esquerda (o início da string).

Então, quanto o ponto deve se mover?

O ponto deve sempre se mover 3 passos para a esquerda.

E se bater na parede (o início da corda), você precisa adicionar 0s e depois um 0s antes do ponto.

Portanto, se o número for, 2.222222, primeiro terei que mover o ponto para a esquerda, vamos mostrar passo a passo.

Step 1:
.2222222

Step 2:
.02222222

Step 3:
0.02222222

Deve ser sempre um 0 antes do ponto, se atingir o início.

Parece mais complicado do que é, só que não sei como explicar.

EDITAR:

Minha tentativa:

      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, "-", "")

Se i /1000, pode funcionar, mas parece que irá alterar o número, deixando-o falhar.

Original: 25.1521584671082

/1000 : 2.51521584671082E-02

Como você pode ver, não funciona como esperado.

Deve se tornar 0,0251521584671082E-02 (E é claro que não quero que "E-" esteja lá.Então, se for possível fazer isso, mas SOMENTE movendo e não dividindo (acho que o Excel é limitado a quantos números ele pode calcular), então funcionará.

Vale a pena notar que os números mostrados são na verdade menores (mais curtos) que o número real, por algum motivo, se eu anotá-lo em um arquivo de texto, ele se tornará o seguinte:

2.51521584671082E-02251521584671082E-02

Como você pode ver, provavelmente bati em uma parede no cálculo, então ele muda para Caracteres (sei que a matemática os usa, mas não tenho ideia do que significam e, de qualquer maneira, são inúteis para mim).

E acho que é por causa deles que falha, mas não tenho certeza.

EDITAR:

Ok, limitando a 15 casas decimais ele retornará a casa correta, mas eu gostaria de não fazer isso, o Excel deveria realmente ser limitado a apenas 15 casas decimais, ou é "Double,Float etc" que faz isso?

EDITAR 2:

O exemplo de Tony fornece isso:

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

Não tenho certeza, mas não é incorreto ou talvez eu tenha feito algo errado?

Se possível, quero que TODOS os decimais e números permaneçam no lugar, pois já está tudo correto, só que estão no lugar errado.

/1000 resolve isso, mas não da melhor maneira, pois irá recalcular em vez de apenas mover.Normalmente eu não me importaria, os resultados são os mesmos, mas aqui isso importa, como você pode ver.

No entanto, posso pensar em uma solução, onde procuro a posição do ponto, depois corto as últimas casas decimais, divido o resultado por 1000 e depois adiciono as últimas casas decimais, embora isso seja mais um hack, não tenho certeza se realmente funcionará.

Concluo que isso está respondido, faz o que eu quero e as limitações estão no cálculo em si, não na solução.Todas as soluções funcionam praticamente da mesma maneira, mas escolhi a de Tony porque ele foi o primeiro a comentar a solução na minha pergunta.

Muito obrigado a todos!

Foi útil?

Solução

Às vezes, seu código falha porque não lida com todas as situações.Você calcula TextPos assim:

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

Você então trata TextPos como 4, 3, 2 ou 1.Mas se, por exemplo, TextBox4.Value = "2.22222" então TextPos = 0 e você não tem código para essa situação.

Às 11h45 GMT, sugeri em um comentário que dividir por 1000 daria o resultado que você busca.Às 14h08 GMT, o tunderblaster postou isso como resposta.Agora são 15h23, mas você não respondeu a nenhum de nós.

Depois de tentar seu código, agora sei que essas respostas não correspondem ao resultado obtido quando funciona porque você remove o sinal.O seguinte forneceria quase o mesmo que uma versão funcional do seu código:

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

A única deficiência desta declaração é que ela não preserva todos os dígitos decimais finais.Isso é realmente importante?

Enquanto eu preparava e postava esta resposta, você editou sua pergunta para afirmar que dividir por 1000 às vezes daria o resultado em formato científico.Minha solução evita esse problema.

Outras dicas

Parece-me, através de todas as suas edições, que você deseja dividir o número por mil.Para fazer isso, você pode simplesmente usar

TextBox4.Value = TextBox4.Value / 1000

Se quiser evitar erros de ponto flutuante ao dividir por 10, você pode usar o Decimal tipo

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

É isso que você está tentando?

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

Experimente isso.Funciona inicialmente preenchendo a string com o início 0's, mudando o DP e, em seguida, removendo qualquer liderança restante desnecessária 0de

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 "resposta" responde à questão de que você deseja o máximo de precisão possível no resultado.

Quando eu estava na escola, isso era chamado de precisão espúria.Esqueci a maior parte da minha matemática nesta área, mas tentarei dar-lhe uma compreensão do assunto.

Eu tenho um valor 2,46, com precisão de 2 casas decimais.Esse é o valor verdadeiro que está em algum lugar na faixa de 2,455 a 2,465.

Se eu inserir esses valores em uma função de raiz quadrada, obterei:

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

A partir disso, vejo que a raiz quadrada do valor verdadeiro está em algum lugar entre 1,567 e 1,570;quaisquer dígitos decimais extras são espúrios.

Se bem entendi, você deseja usar esses números para fazer ajustes.Você é capaz de fazer ajustes em 15 dígitos decimais?

Se você se lembra do seu cálculo, pode procurar "propagação de erro" para obter uma explicação melhor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top