我试图使一个特定的字符串与数字改变形式,使它看起来像下面。

修改为用数字而不是X显示。

让我们开始吧,我得到一个数字,像这样。

234.123123123

我需要改变它的出现方式,对于一个点之前的3位数字,它需要成为。

0.234123123123

让我们说它的2.23123123123,这将成为0.0023123123123

现在我将尝试用我的英语解释公式。

式需要改变点的位置"。".你可以看到它改变了地方,但你也可以看到我正在添加0。

这很重要,如果点到最左边(字符串的开头),则需要添加0。

那么点必须移动多少?

点必须始终向左移动3步。

如果它碰到墙(字符串的开始),你需要添加0,然后在点之前添加一个0。

所以如果数字是,2.222222 我首先必须将点移动到左边,让我们一步一步显示。

Step 1:
.2222222

Step 2:
.02222222

Step 3:
0.02222222

它必须始终是一个0之前的点,它曾经击中开始。

这听起来更复杂,只是我不知道如何解释它。

编辑:

我的尝试:

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

如果我/1000它,可能会工作,但它似乎会改变数字,让它失败。

Original: 25.1521584671082

/1000 : 2.51521584671082E-02

正如你所看到的,它没有按预期工作。

它应该成为0.0251521584671082E-02(当然我不希望"E-"在那里。所以,如果有可能做到这一点,但只移动而不是实际上,分割(我认为excel仅限于它可以用多少数字计算),那么它就会起作用。

值得注意的是,显示的数字实际上更少(更短)然后是实数由于某种原因,如果我把它写下来一个文本文件,它就变成了这个:

2.51521584671082E-02251521584671082E-02

所以正如你所看到的,我可能在计算中碰到了一堵墙,所以它改变了字符(我知道数学使用那些,但不知道它们的意思,而且它们对我来说是无用的)。

我认为这是因为他们,它失败了,虽然不确定。

编辑:

好吧,通过限制到15位小数,它将返回正确的位置,但我不想这样做,Excel是否真的应该仅限于15位小数,或者是"Double,Float etc"这样做?

编辑2:

Tony的例子提供了这一点:

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

不太确定,但这不是不正确的,或者我做错了什么?

如果可能的话,我希望所有的小数和数字都留在原地,因为一切都已经正确,只是他们在错误的地方。

/1000解决了这个问题,但不是最好的方法,因为它会重新计算而不是仅仅移动。通常我不会关心,结果是一样的,但在这里,你可以看到它确实很重要。

然而,我可以想到一个解决方案,在那里我会寻找点的位置,然后切出最后一位小数,将结果除以1000,然后再添加最后一位小数,尽管这更像是一个黑客,不确定

我得出结论,这是回答,它做我想要的,并且限制在计算本身,而不是解决方案。所有解决方案的工作方式几乎相同,但我选择了Tony's,因为他是第一个在我的问题中评论解决方案的人。

非常感谢大家!

有帮助吗?

解决方案

您的代码有时失败,因为它没有处理每种情况。您计算TextPOS:

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

然后,处理类型为4,3,2或1.

在GMT 11:45,我建议在评论中,除以1000的分裂会给你你寻求的结果。 GMT 14:08,Tunderblaster将此作为答案。现在是15:23,但你没有回应我们中的任何一个。

已尝试过您的代码,我现在知道这些答案与其在工作时提供的结果不匹配,因为您删除了标志。以下将为您提供与代码的工作版本相同:

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

此声明的唯一缺点是它不保留所有尾随十进制数字。这真的很重要吗?

虽然我正在准备和发布此答案的同时,您对讨论划分1000的答案有时会使结果提供科学格式。我的解决方案避免了这个问题。

其他提示

它看起来可以通过你想要将数字划分一千的所有编辑。为此,您可以简单地使用

TextBox4.Value = TextBox4.Value / 1000
.

如果要避免在划分10时避免浮点错误,则可以使用Decimal类型

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

是你尝试的吗?

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
.

试试这个。它的工作原理是用前导填充字符串 0's,转移DP,然后删除任何不需要的剩余领先 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

这个“答案”对您希望尽可能多的精度的问题。

当我在学校时,这被称为杂散的准确性。我在这个领域忘记了大部分数学,但我会尽力让你了解这个问题。

我有一个值,2.46,准确到2个小数位。这是真正的价值在2.455到2.465范围内的某个位置。

如果我将这些值馈送到平方根函数中,我将得到:

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

从此我看到真实值的平方根是1.567和1.570之间的某个位置;任何额外的小数位是虚假的。

如果我理解正确,您希望使用这些数字进行调整。您是否能够调整15个十进制数字?

如果您记得您的微积分,可以查看“错误竞争”,以获得更好的解释。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top