如何在不转换为数字的情况下将数字字符串除以1000?

时间:2014-01-11 09:58:45

标签: string excel-vba vba excel

我正在尝试使用Digits更改表单创建一个字符串,以便它看起来像下面。

修改为以数字而非X显示。

所以我们设置,我得到一个数字,就像这样。

234.123123123

我需要改变它的显示方式,对于Dot之前的3位数,它需要变为。

0.234123123123

我们说它是2.23123123123,那将成为,0.0023123123123

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

公式需要改变Dot“。”的位置。 你可以看到它改变了地方,但你也可以看到我正在添加0。

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

那么Dot必须移动多少?

点必须始终向左移动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, "-", "")

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

Original: 25.1521584671082

/1000 : 2.51521584671082E-02

如您所见,它无法按预期工作。

它应该变成0.0251521584671082E-02(当然我不希望“E-”在那里。 因此,如果有可能这样做,但只是移动而不是实际上,划分(我认为excel仅限于它可以计算的数量),那么它将起作用。

值得注意的是,显示的数字实际上比实际数字更少(更短),如果我将其写入文本文件,它就变成了这样:

2.51521584671082E-02251521584671082E-02

正如你所看到的,我可能在计算中遇到了一个墙,所以它变成了人物(我知道数学会使用那些,但不知道它们是什么意思,而且无论如何它们对我都没用。)

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

编辑:

好的,通过限制为15位小数,它将返回正确的位置,但我不想这样做,如果Excel真的只限于15个小数,或者是“Double,Float etc”这样做?

编辑2:

托尼的例子提供了这个:

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

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

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

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

我可以想到一个解决方案,我直到找到Dot的位置,然后删除最后的小数,将Result除以1000,然后再添加最后的小数,尽管这更像是一个黑客,不确定它是否真的有用。

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

非常感谢大家!

6 个答案:

答案 0 :(得分:3)

在我看来,通过所有编辑,您想要将数字除以一千。为此,您只需使用

即可
TextBox4.Value = TextBox4.Value / 1000

答案 1 :(得分:1)

您的代码有时会失败,因为它无法处理所有情况。你计算TextPos:

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

然后您处理TextPos为4,3,2或1.但是,例如,如果TextBox4.Value =“2.22222”,则TextPos = 0,并且您没有该情况的代码。

格林尼治标准时间11:45,我在评论中建议除以1000会得到你所寻求的结果。格林尼治标准时间14:08,tunderblaster发布了这个答案。现在是15:23,但你没有对我们任何一个做出回应。

尝试过你的代码之后,我现在知道这些答案与它在工作时给出的结果不符,因为你删除了这个符号。以下内容与您的代码的工作版本几乎相同:

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

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

当我准备并发布此答案时,您编辑了一个问题,表示除以1000有时会以科学格式给出结果。我的解决方案避免了这个问题。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

这是你在尝试的吗?

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

答案 4 :(得分:1)

试试这个。它的工作方式是首先用前导0填充字符串,移动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

答案 5 :(得分:0)

这个“答案”回答了你想要的结果尽可能精确的问题。

当我在学校时,这被称为虚假准确性。我忘记了这方面的大部分数学,但我会尽力让你理解这个问题。

我的值为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位十进制数字吗?

如果你还记得你的微积分,你可以查找“错误的传播”以获得更好的解释。