Domanda

Sto cercando di creare una certa stringa con la forma di cambiamento delle cifre, in modo che sia simile al di sotto.

modificato per mostrare con cifre invece di x.

Quindi impostiamo, ottengo un numero, come questo.

234.123123123

Ho bisogno di cambiare come appare, per 3 cifre prima di un punto, avrebbe bisogno di diventare.

0.234123123123

e dicono che è 2.23123123123, che sarebbe diventato, 0.0023123123123

Ora cercherò di spiegare la formula, nudo con il mio inglese.

La formula deve cambiare la posizione del punto ".". Puoi vedere che cambia posto, ma puoi anche vedere che sto aggiungendo 0s.

È importante, gli 0s devono essere aggiunti se il punto è all'aria aperta (l'inizio della stringa).

Quindi quanto deve muovere il punto?

Il punto deve sempre spostare 3 gradini a sinistra.

E se ha colpito il muro (inizio della stringa) devi aggiungere 0s, e poi uno 0s prima del punto.

Quindi se il numero è, 2.222222 Prima dovrò spostare il punto a sinistra, lasciamo show passo dopo passo.

Step 1:
.2222222

Step 2:
.02222222

Step 3:
0.02222222
.

Deve sempre essere un 0 prima del punto, è mai stato iniziato.

Sembra più complicato, allora è, è proprio che non so come spiegarlo.

Modifica:

Il mio tentativo:

      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 IT, potrebbe funzionare, ma sembra che modificherà il numero, lasciandolo a fallire.

Original: 25.1521584671082

/1000 : 2.51521584671082E-02
.

Come puoi vedere, non funziona come previsto.

Dovrebbe diventare 0.0251521584671082E-02 (e ovviamente non voglio "E-" di essere lì. Quindi, se è possibile farlo, ma solo muoversi e non in realtà, dividendo (penso che Excel sia limitato a quanti numeri può calcolare con) allora funzionerà.

Vale la pena notare, i numeri mostrati sono in realtà meno (più corti) del numero reale per qualche motivo, se lo scrivo a un file di testo, diventa questo:

2.51521584671082e-02251521584671082e-02

Così come puoi vedere, probabilmente colpisco un muro nel calcolo, quindi cambia i personaggi (conosco la matematica usa quelle, ma non ho idea di cosa significano, e sono inutili per me comunque).

E penso che sia a causa loro che fallisce, non sono sicuro però.

Modifica:

Okay, limitando a 15 decimali, restituirà il posto giusto, ma vorrei non farlo in giro, dovrebbe essere esattamente limitato a soli 15 decimali, o è "doppio, float ecc." che fa questo ?

Modifica 2:

L'esempio di Tony fornisce questo:

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

Non proprio sicuro, ma non è errato, o forse ho fatto qualcosa di sbagliato?

Se possibile, voglio tutti i decimali e il numero per rimanere in atto, poiché tutto è già corretto, è solo che sono nel posto sbagliato.

/ 1000 risolve questo, ma non nel modo migliore, in quanto si ricalcetterà invece di spostarsi. Normalmente non mi interesserei, i risultati sono gli stessi, ma qui importa come puoi vedere.

Posso tuttavia pensare a una soluzione, dove finché non cerco la posizione del punto, quindi tagliare gli ultimi decimali, dividere il risultato di 1000, quindi aggiungi gli ultimi decimali, anche se è più di un hack, Non sono sicuro se funzionerà effettivamente.

Concludo che questo è risposto, fa quello che voglio, e le limitazioni sono nel calcolo stesso, non la soluzione. Tutte le soluzioni funzionano praticamente nello stesso modo, ma ho scelto Tony come è prima di commentare la soluzione nella mia domanda.

Molte grazie a tutti!

È stato utile?

Soluzione

Il codice a volte fallisce perché non gestisce ogni situazione. Calcola i textpos quindi:

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

Eri quindi gestire Textpos è 4, 3, 2 o 1. Ma se, ad esempio, TextBox4.Value="2.222222", quindi Textpos= 0 e non hai codice per quella situazione.

Alle 11:45 GMT, ho suggerito in un commento che dividere per 1000 ti darebbe il risultato che cerchi. Alle 14:08 GMT, il tunderblaster ha pubblicato questo come risposta. Ora è 15:23 ma non hai risposto a nessuno dei due.

Avendo provato il tuo codice, ora so che queste risposte non corrispondono al risultato che dà quando funziona perché rimuovi il segno. Quanto segue ti darà quasi lo stesso di una versione funzionante del tuo codice:

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

L'unica carenza di questa affermazione è che non conservare tutte le cifre decimali finali. È davvero importante?

Mentre stavo preparando e pubblicando questa risposta, hai modificato la tua domanda per affermare che dividere per 1000 a volte darebbe il risultato in formato scientifico. La mia soluzione evita quel problema.

Altri suggerimenti

Mi sembra attraverso tutte le tue modifiche che vuoi dividere il numero di mille.Per fare questo, puoi semplicemente usare

TextBox4.Value = TextBox4.Value / 1000
.

Se si desidera evitare errori del punto flottante durante la divisione di 10, è possibile utilizzare il tipo Decimal

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

è questo ciò che stai provando?

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
.

Prova questo.Funziona con imbottitura inizialmente la stringa con leader 0's, spostando il DP, quindi rimuovendo qualsiasi inecastario rimanente leader 0

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
.

Questa "risposta" risposte al problema che desideri tanta precisione nel risultato possibile.

Quando ero a scuola questa era chiamata accuratezza spuria.Ho dimenticato la maggior parte della mia matematica in quest'area, ma cercherò di darti una comprensione del problema.

Ho un valore, 2.46, che è accurato a 2 punti decimali.Questo è il vero valore è da qualche parte nell'intervallo da 2,455 a 2.465.

Se alimentano questi valori in una funzione radice quadrata, otterrò:

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

Da questo vedo la radice quadrata del valore reale è da qualche parte tra 1,567 e 1,570;Qualsiasi cifra decimale extra è spuria.

Se capisco correttamente, desideri utilizzare questi numeri per effettuare regolazioni.Sei in grado di effettuare aggiustamenti a 15 cifre decimali?

Se ricordi il tuo calcolo puoi cercare "Propogazione di errore" per una migliore spiegazione.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top