String 如何将数字字符串除以1000而不转换为数字?

String 如何将数字字符串除以1000而不转换为数字?,string,excel,vba,String,Excel,Vba,我试图使一个数字字符串改变形式,这样它看起来像下面这样 修改为用数字而不是X显示 让我们设定,我得到一个数字,像这样 234.123123 我需要改变它的显示方式,对于圆点之前的3位数字,它需要变成 0.234123123 假设它是2.23123,也就是0.0023123 现在我将尝试用我的英语解释这个公式。 Original: 25.1521584671082 /1000 : 2.51521584671082E-02 公式需要更改点“”的位置。 您可以看到它改变了位置,但您也可以看到我正在

我试图使一个数字字符串改变形式,这样它看起来像下面这样

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

让我们设定,我得到一个数字,像这样

234.123123

我需要改变它的显示方式,对于圆点之前的3位数字,它需要变成

0.234123123

假设它是2.23123,也就是0.0023123

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

Original: 25.1521584671082

/1000 : 2.51521584671082E-02
公式需要更改点“”的位置。 您可以看到它改变了位置,但您也可以看到我正在添加0

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

那么圆点必须移动多少呢

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

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

如果这个数字是,2.2222 我将首先把点移到左边,让我们一步一步地显示

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.025521584671082E-02(当然我不希望“E-”出现在那里)。 所以,如果有可能做到这一点,但只是移动,而不是实际的除法(我认为excel仅限于它可以计算多少个数字),那么它就可以工作了

值得注意的是,由于某种原因,显示的数字实际上比实际数字要少(短),如果我将其写入文本文件,它会变成:

2.51521584671082E-02515215846711082E-02

如你所见,我可能在计算中撞到了墙,所以它变成了字符(我知道数学使用这些字符,但不知道它们的意思,而且它们对我来说毫无用处)

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

编辑:

好的,通过限制在15位小数,它将返回正确的位置,但我不想这样做,Excel真的应该限制在15位小数,还是“双精度、浮点等”这样做

编辑2:

Tony的例子提供了以下内容:

Original: 177.582010543847177582010543847
Tony's: 0.1775820110177582011
Round(15decimals): 0.1775820105438470177582010543847
不是很确定,但这不是不对吗,或者我做错了什么

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

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

但是我可以想出一个解决方案,我一直在寻找点的位置,然后去掉最后的小数,将结果除以1000,然后再加上最后的小数,虽然这更像是一个黑客,但不确定它是否真的有效

我的结论是,这个问题得到了回答,它满足了我的要求,其局限性在于计算本身,而不是解决方案。 所有解决方案的工作原理基本相同,但我选择了Tony's,因为他是第一个在我的问题中评论解决方案的人。

Original: 25.1521584671082

/1000 : 2.51521584671082E-02

非常感谢大家!

在我看来,通过您所有的编辑,您希望将数字除以1000。要做到这一点,您只需使用

TextBox4.Value = TextBox4.Value / 1000

您的代码有时会失败,因为它不能处理所有情况。您计算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有时会得到科学格式的结果。我的解决方案避免了此问题。

如果您想避免除以10时出现浮点错误,可以使用
十进制类型

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
填充字符串,移动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
函数shiftDecimalInstalling(str为字符串,Places为长)为字符串
我想我会坚持多久
如果位置>0,则
'向左移动DP
'用前导0填充'
str=Replace$(空格$(Places),“”,“0”)&str
"立场,。
i=仪表(str,“.”)
str=替换$(str,“.”,“”)
如果i>0,那么
“左移
str=左$(str,i-Places-1)&“&Mid$(str,i-Places)
'剥离不必要的前导0'
左做$(str,2)=“00”
str=Mid$(str,2)
环
如果str喜欢“0[!.]*”,那么
str=Mid$(str,2)
如果结束
ShiftDecimalInString=str
其他的
“不,在街上
ShiftDecimalInString=str
如果结束
如果其他位置小于0,则
'ToDo:将DP向右移动的句柄
其他的
'将DP移到0个位置
ShiftDecimalInString=str
如果结束
端函数
这个“答案”回答了一个问题,即您希望在回答时尽可能精确