如何从 Excel 中的数字中获取第一个有效数字?

How to get first significant figure from a number in Excel?

我有一列 Excel 2016 年的数字。这些数字跨越多个数量级,但都是正数。有些小于零。我如何 return 新列中每个单元格的第一个有效数字?

例如,对于数字 1.9,结果应为 1。对于数字 0.9,结果应为 9。

我尝试过的事情:

您可以将该数字乘以 10 的系数,足以处理任何 0 不需要的:

=--LEFT(A1*10^LEN(A1),1)

您可以使用科学记数法:

=LEFT(TEXT(A1,"0.000000000000000E+00"))

注意:Excel 中只能有 15 位精度,所以这应该没问题。

将单元格值读取为文本,将点和零 (. / 0) 替换为空,return 最左边 "character";将其乘以 1 将其强制转换回数字:

=LEFT(SUBSTITUTE(SUBSTITUTE(TEXT(A1,"@"),".",""),"0",""))*1

您还可以创建使用正则表达式的自定义 UDF(用户定义函数)来完成此任务。这将需要 copy/paste VBA 知识,以及您设置对以下内容的引用:

Microsoft VBScript Regular Expressions 5.5

(可以通过转到 VBE (Alt+F11),工具 > 参考来完成。然后选中上面列出的参考框)

将以下 UDF 粘贴到 VBE 中的标准代码模块中:

Public Function SigNum(ByVal InputNumber As Double) As Long

    Dim s As SubMatches

    With New RegExp

        .Pattern = "\.0*([^0])|^([^0])"
        If .test(InputNumber) Then

            Set s = .Execute(InputNumber)(0).SubMatches
            If s(0) > 0 Then    ' This is before the period
                SigNum = s(0)
            Else
                SigNum = s(1)
            End If

        End If

    End With

End Function

在您的工作表上,您可以这样使用新创建的公式:

=SigNum(A1)

您可以在 regex101 的示例中看到它匹配的内容。 查看此网站时,绿色突出显示的数字是 return 如果值小于 0,红色突出显示的数字是 return 如果值 > 0)。如果值 = 0,这将 return 0.


打破模式

模式 \.0*([^0])|^([^0]) 的工作原理如下。首先,您可以看到有一个 |,它本质上就像一个 Or 语句,所以我们将把它们分成两部分。

第一节\.0*([^0])

  • \. 将匹配文字句点。这确保我们正在查看小于 0 的值。
  • 0* 匹配全零,0 到无限制 * 次。我们使用 *(零到无限制)而不是 +(1 到无限制),因为零不需要位于有效数字的前面 - 但零本身 isn' t 显着。
  • [^0]这是一个否定字符class[^...]。这意味着它将匹配 不是 的任何内容 class。由于我们的有效数字应该是零以外的值,因此我们不想匹配零。因为它被捕获组 (...) 包围,这就是 return 返回给函数的内容。

第二节^([^0])

我们已经确定,由于第一部分不匹配,因此该值必须大于 0。

  • ^这是一个匹配字符串开头的锚点。在第一部分我们不需要它,因为我们基本上使用句点 \. 作为我们的锚点。由于我们的值大于 0,因此我们需要确保从输入数字的绝对左侧开始。
  • (...) 捕获组。该组中的任何内容都将作为子匹配 returned 并最终返回到函数,因为它是 return 值。
  • [^0] 否定字符 class。它将匹配除 0 以外的任何内容。