如何从 Excel 中的数字中获取第一个有效数字?
How to get first significant figure from a number in Excel?
我有一列 Excel 2016 年的数字。这些数字跨越多个数量级,但都是正数。有些小于零。我如何 return 新列中每个单元格的第一个有效数字?
例如,对于数字 1.9,结果应为 1。对于数字 0.9,结果应为 9。
我尝试过的事情:
- 使用
LEFT()
获取第一个字符。这适用于大于 1 的值,但对于 0 - 1 之间的数字,它 returns 0(即 LEFT(0.3, 1)
returns 0)。我试过将其与科学记数法格式一起使用,结果 return 是相同的结果。
- 我已经在 Google 和 SO 中搜索了此问题的解决方案。有很多关于四舍五入到有效数字的帖子,但我希望截断,而不是四舍五入。
- 阅读有关科学记数法的 Office 在线文档。
您可以将该数字乘以 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 以外的任何内容。
我有一列 Excel 2016 年的数字。这些数字跨越多个数量级,但都是正数。有些小于零。我如何 return 新列中每个单元格的第一个有效数字?
例如,对于数字 1.9,结果应为 1。对于数字 0.9,结果应为 9。
我尝试过的事情:
- 使用
LEFT()
获取第一个字符。这适用于大于 1 的值,但对于 0 - 1 之间的数字,它 returns 0(即LEFT(0.3, 1)
returns 0)。我试过将其与科学记数法格式一起使用,结果 return 是相同的结果。 - 我已经在 Google 和 SO 中搜索了此问题的解决方案。有很多关于四舍五入到有效数字的帖子,但我希望截断,而不是四舍五入。
- 阅读有关科学记数法的 Office 在线文档。
您可以将该数字乘以 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 以外的任何内容。