有人知道是否可以在带有 SI 前缀的 MS Excel 中显示数字?
我想拥有
... 1 n, 1 µ, 1 m, 1, 1 k, 1M, 1 G, ...
而不是科学格式
... 1E-09、1E-06、1E-03、1、1E+03、1E+06。1E+09, ...
也许添加一个单位,如 V(伏特)、F(法拉)等。
我会是完美的,如果单元格仍然包含数字而不是字符串,那么它可以很容易地更改为另一种格式(回到科学或其他格式)
有人知道是否可以在带有 SI 前缀的 MS Excel 中显示数字?
我想拥有
... 1 n, 1 µ, 1 m, 1, 1 k, 1M, 1 G, ...
而不是科学格式
... 1E-09、1E-06、1E-03、1、1E+03、1E+06。1E+09, ...
也许添加一个单位,如 V(伏特)、F(法拉)等。
我会是完美的,如果单元格仍然包含数字而不是字符串,那么它可以很容易地更改为另一种格式(回到科学或其他格式)
你可以做这样的事情,我从Millions & Thousands Custom Number Formatting得到:
[>=1000000] #,##0.0,," MΩ";[<1000000] #,##0.0," kΩ";General
400
呈现为0.4 kΩ
(可能不是你想要的)4000
呈现为4.0 kΩ
40e3
呈现为40.0 kΩ
40e6
呈现为40.0 MΩ
但是您可能可以添加更多子句来涵盖其他范围。 没关系,你不能。
您还可以使用 LOG 和 CHOOSE 将其保持在一个公式中并且相当紧凑。
=ROUND(
E10 / (1000 ^ INT(LOG(ABS(E10),1000)) )
,0
) & CHOOSE(
INT(LOG(ABS(E10),1000)) + 6
,"f","p","n","µ","m","","k","M","G","T","P"
)
在这个公式中:
没有比科学记数法更好的解决方案了。
如果您使用自定义数字格式,则必须手动(或使用 VBA)输入它们,这样它们将掩盖单元格的实际内容。
例如,如果要显示以下格式对:
1 n 1E-09
1 µ 1E-06
1 m 1E-03
1 1
1 k 1E+03
1 M 1E+06
1 G 1E+09
如果您有 0.001,则必须将格式设置为"1 m"
-- 这将掩盖数字,因此如果您有 0.002,则必须将其设置为"2 m"
-- 如果将其更改为 0.004,它仍会显示2 m
为结果。这显然并不理想。
您可以将其设置为一个两列的表格,其中左侧有值,并使用公式在右侧显示单位,但最终您无法使用格式化的值进行数学运算。
所以基本上,答案是“不”,这是不可能的。
从理论上讲,您可以编写一个 VBA 脚本,该脚本将在更改数字时根据单元格内容自动更改可见内容,但是该脚本会很庞大,并且如果您发送给的人关闭了宏,就会给他们带来严重的麻烦。它还需要各种极端情况,具体取决于您是否希望在某些单元格中“正常”格式化数字。所以虽然理论上可能,但实际上是不可能的
使用转换表以及匹配和索引函数虽然很庞大,但这是可能的。
从这样的转换表(2列):
1.E+15 P
1.E+12 T
1.E+09 G
1.E+06 M
1.E+03 k
1.E+00
1.E-03 m
1.E-06 µ
1.E-09 n
1.E-12 p
1.E-15 f
然后您可以执行以下翻译
3.68437E+11 --> 368.44 G
如果 A 列和 B 列中有转换表,单元格 G1 中有未格式化的数字
H1
=G1/INDEX(A:A,MATCH(G1,$A:$A,-1)+1)
I1
=INDEX($B:$B,MATCH(G1,$A:$A,-1)+1)
然后正确的数字将显示在 H 列中,并在 I 列中显示后缀/前缀。
它仍然很笨重,并且只能用于最终输出,因为根据修改后的数字进行的计算必须包括反向转换。
我不知道如何将其作为数字格式(然后您可以像使用任何其他数值一样使用格式化的数字进行后续计算),但是为了简单地使用 SI 前缀呈现数字,这是我使用的公式。它采用指定单元格中的公式(通常在它旁边,在本例中为 E28),缩放数字,四舍五入到指定的有效数字数(在本例中为 3),附加适当的 SI 前缀,然后附加指定的单位(在这种情况下,“F”代表法拉)。这里的优点是公式是独立的,不需要任何外部参考表。此公式适用于 femto (10^-15) 到 Tera (10^12),但可以轻松扩展为其他前缀
=CONCAT(
ROUND(
IF(E28>1E12, E28/1E12,
IF(E28>1E9, E28/1E9,
IF(E28>1E6, E28/1E6,
IF(E28>1E3, E28/1E3,
IF(E28>1, E28,
IF(E28>1E-3, E28*1E3,
IF(E28>1E-6, E28*1E6,
IF(E28>1E-9, E28*1E9,
IF(E28>1E-12, E28*1E12,
E28*1E15
) ) ) ) ) ) ) ) ),
3 +N("This is the number of significant digits to round to")
-(1+INT(LOG10(ABS(
IF(E28>1E12, E28/1E12,
IF(E28>1E9, E28/1E9,
IF(E28>1E6, E28/1E6,
IF(E28>1E3, E28/1E3,
IF(E28>1, E28,
IF(E28>1E-3, E28*1E3,
IF(E28>1E-6, E28*1E6,
IF(E28>1E-9, E28*1E9,
IF(E28>1E-12, E28*1E12,
E28*1E15
) ) ) ) ) ) ) ) ) ))))
),
IF(E28>1E12, "T",
IF(E28>1E9, "G",
IF(E28>1E6, "M",
IF(E28>1E3, "k",
IF(E28>1, "",
IF(E28>1E-3, "m",
IF(E28>1E-6, "µ",
IF(E28>1E-9, "n",
IF(E28>1E-12, "p",
"f"
) ) ) ) ) ) ) ) ),
"F" +N("This is the unit symbol that will be appended to the end")
)
如果您想四舍五入到固定数量的小数而不是有效数字,公式会更简单一些:
=CONCAT(
ROUND(
IF(E28>1E12, E28/1E12,
IF(E28>1E9, E28/1E9,
IF(E28>1E6, E28/1E6,
IF(E28>1E3, E28/1E3,
IF(E28>1, E28,
IF(E28>1E-3, E28*1E3,
IF(E28>1E-6, E28*1E6,
IF(E28>1E-9, E28*1E9,
IF(E28>1E-12, E28*1E12,
E28*1E15
) ) ) ) ) ) ) ) ),
3 +N("This is the number of decimal digits to round to")
),
IF(E28>1E12, "T",
IF(E28>1E9, "G",
IF(E28>1E6, "M",
IF(E28>1E3, "k",
IF(E28>1, "",
IF(E28>1E-3, "m",
IF(E28>1E-6, "µ",
IF(E28>1E-9, "n",
IF(E28>1E-12, "p",
"f"
) ) ) ) ) ) ) ) ),
"F" +N("This is the unit symbol that will be appended to the end")
)
请注意,我已经用指数表示法编写了所有缩放常数,当您输入公式时,Excel 会将它们更改为纯数字。通过使用相对单元格引用,可以很容易地将公式复制并粘贴到您需要的位置。
该公式可以压缩为单个 IF/CONCAT/ROUND 语句块,但像我在这里所做的那样安排它会将舍入常数分离为公式中的一个点,使其更容易更改。
只需选择要包含给定符号的单元格或单元格范围。右键单击单元格并选择格式化单元格。左边选择NUMBER格式,右边输入小数位等。现在在左侧的格式选项列表中一直向下,然后选择 CUSTOM。(重要提示:不要选择右侧的任何自定义格式选项。)左键单击 TYPE: 下方的框和自定义格式选项列表上方。(此框显示您当前选择的格式。{0.00 if you selected the default number format} 您希望保留此格式并添加其他格式。)单击 0.00 右侧并键入以下内容:“ μ”单击 OKAY,您可以正常输入您的数据。格式化单元格对您输入的值没有影响。您可以正常执行所有功能。Excel中的特殊符号
这是谷歌表格的有限答案,使用实际数字格式而不是输出文本的表达式。
从 endolith 的回答中分离出来,我决定这样做:
[>=1E6] #,##0.0,,"M";[>1E3] #,##0.0,"K";0.#####################
它适用于从 1 到 <1E16 的数字,但不能扩展到 M 以上的单位。不适用于负数或小数。它受到 Google 表格能够解析的条件部分数量的限制。
文档:https ://developers.google.com/sheets/api/guides/formats#number_format_patterns
' Hans Wolfgang Schulze 20190921, cause I always need this and need to write it again cause I forgot where I saved it.
' Paste this into Excel's Macro Editor (F11) and use from any cell.
' Copyleft 2019. Please include original author's name in all derivative works.
'
' Note that the conversions in this code is assuming normal Base 10, and not Binary 1024. Lots of code has to change.
' Currently recognizes numbers like "-123123.123G" or "123E15" with or without actual units.
' Special case of Excel's "-" nothing equals 0.
' Assumes, if exists, that the rightmost character is the SI exponent designation - See expS below.
' Usage: =DSci("45e9k") gives "4.5E12" as an answer.
Const expS = "-qryzafpnum KMGTPEZYRQ" ' https://en.wikipedia.org/wiki/Metric_prefix
Function DSci(inputS As String) As Double
Dim which As Integer
which = InStr(expS, Right(inputS, 1))
whichUnitary = InStr(expS, " ") ' offset into expS for " " unity value
If which = 0 Then
which = InStr("----F-Nµ- k-gt-e", Right(inputS, 1)) ' try alt case and form that aren't obscure ie k=K or m!=M
End If
If which > 0 Then ' has a terminating exponential character. 1 is not found.
If which = 1 Then ' "-"
DSci = 0 ' excel nothing value (0)
Else ' convert only the left side of input
DSci = CDbl(Left(inputS, Len(inputS) - 1)) * 10# ^ ((which - whichUnitary) * 3#) ' fix for Binary K's
End If
Else
DSci = CDbl(inputS) ' convert whole string instead ' special case devide by 1.024 for each 1000 for Binary K's
End If
End Function
' Formats to SI convention 10 ^ (-30 ... +30) and recent suggested expansions
' Usage =Sci(5.531e9, "B") gives string of "5.531GB"
' Significant digits are suggested as 4, can be any positive number.
Function Sci(value As Double, optionalUnit As String, Optional significant As Integer = 4) As String
Dim mant As Double, exp As Double, rank As Integer
rankUnitary = InStr(expS, " ") ' offset into expS for " " unity value
If value = 0 Then exp = 0 Else exp = Log(value) / Log(10#) ' nDigits
mant = value / (10# ^ exp) '
While mant >= 999.9999999999 ' don't want 2000K, rather 2M. Change to 1023.9999999999# for Binary K's
exp = exp + 3#
mant = mant / 1000# ' change to 1024# for binary K's etc.
Wend
rank = Int((exp + 0.0000000000001) / 3#) ' should be >1E-300 or so? Why not? 3 != 3#? More changes for Binary K's ?
mant = mant * 10# ^ (-rank * 3# + exp) ' adjust mantussa after de-ranking. Change?? for Binary K's
If Abs(rank) >= rankUnitary Then ' outside of +/- yY bounds
expChar = "?" ' what do you call it then? Not defined.
Else
expChar = Mid(expS, rank + rankUnitary, 1) ' add SI
End If
Sci = Left(mant, Abs(significant)) ' don't allow negative numbers, pretend they are positive lengths
If Right(Sci, 1) = "." Then Sci = Left(Sci, Len(Sci) - 1) ' lop off right DP
Sci = Sci & " " & expChar & optionalUnit
End Function