MS Excel中数字格式的SI前缀

时间:2013-09-24 21:05:54

标签: excel format excel-2007

有人知道是否可以在带有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(法拉)等单位

我会很完美,如果单元格仍然包含数字而不是字符串,那么可以很容易地将其更改为其他格式(回到科学或其他)

8 个答案:

答案 0 :(得分:2)

你可以做这样的事情,我从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Ω

你可以添加更多的条款来涵盖其他范围。 Nevermind, you can't.

答案 1 :(得分:1)

任何解决方案都不会比科学记法更好。

如果您使用自定义数字格式,则必须手动输入(或使用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 :(得分:0)

虽然使用转换表和匹配和索引函数很笨重,但这是可能的。

从像这样的转换表(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列中带有后缀/前缀。

它仍然很笨重,只能用于最终输出,因为修改后的数字计算必须包含反向翻译。

答案 3 :(得分:0)

我不知道这样做是一种数字格式(然后您可以像使用任何其他数值一样使用格式化的数字进行后续计算),但是为了使用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语句的单个块,但是如我在此处所做的那样排列将舍入常量分离为公式中的单个点,使其更容易更改。

答案 4 :(得分:0)

只需选择要包含给定符号的单元格或单元格区域。右键单击单元格,然后选择FORMAT CELLS。选择左侧的NUMBER格式,在右侧输入小数位等。现在,在左侧的格式选项列表中一直向下,然后选择CUSTOM。 (重要提示:请勿在右侧选择任何自定义格式选项。)左键单击TYPE下面的框:并在自定义格式选项列表上方。 (此框显示您当前选择的格式。{0.00如果您选择了默认数字格式}您希望保留此格式并添加其他格式。)单击右侧的0.00并键入以下内容:“μ”单击OKAY您可以正常输入您的数据。格式化单元格对您输入的值没有影响。您可以正常执行所有功能。我附上了一张照片,我使用相同的指令将垃圾和希腊MU符号应用于数值并执行一些基本计算,而不会妨碍Excel的运行能力。Special Notation in Excel

答案 5 :(得分:0)

您还可以使用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"
)

在此公式中:

  • E10(指3次)是包含原始值的单元格。
  • 要显示的ROUND格式数字,此处四舍五入为无小数(0)。
  • INT(LOG(ABS(E10),1000))是前缀索引-5到+5。
  • CHOOSE是要使用的前缀(需要正索引,因此需要+ 6)。

答案 6 :(得分:0)

对于Google表格,这是一个有限的答案,它使用实际的数字格式而不是输出文本的表达式。

从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

答案 7 :(得分:0)

' Hans Wolfgang Schulze 20190921, cause I always need this and need to write it again cause I forgot where I saved it.
' 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: "45e9k" -> 4.5E12
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 5.531e9, "B" -> 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