【问题标题】:SI-prefixes for number format in MS ExcelMS Excel 中数字格式的 SI 前缀
【发布时间】:2013-09-24 21:05:54
【问题描述】:

有人知道是否可以在 MS Excel 中显示带有 SI 前缀的数字?

我想拥有

... 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(法拉)等。

如果单元格仍然包含数字而不是字符串,那我就完美了,因此可以轻松地将其更改为另一种格式(返回科学格式或其他格式)

【问题讨论】:

  • 在 superuser.com 上回答这个问题可能会更好。
  • 我之前添加了单位符号,这不是问题,但前缀肯定是。 (我的意思是单位的前缀:)但它们可能也是数字的后缀)

标签: excel format excel-2007


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      没有比科学记数法更好的解决方案了。

      如果您使用自定义数字格式,则必须手动(或使用 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 脚本,当一个数字改变时,它会根据单元格内容自动改变可见的内容,但是这个脚本会很庞大,并且会给你发送给的人造成严重的麻烦,如果他们有宏关闭。它还需要各种极端情况,具体取决于您是否希望在某些单元格中“正常”格式化数字。所以虽然理论上可能,但实际上是不可能的

      【讨论】:

      • 谢谢,至少现在我不会再浪费时间了
      【解决方案4】:

      使用转换表以及匹配和索引函数虽然很庞大,但这是可能的。

      来自这样的转换表(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 列中显示后缀/前缀。

      它仍然很笨重,并且应该只用于最终输出,因为根据修改后的数字进行计算必须包括反向转换。

      【讨论】:

      • 刚刚意识到我包括 B(十亿)而不是 G,然后在我的转换表中添加了一个 G。这搞砸了订单。只需删除 B 所以 G 是 10^9 和 T 是 10^12 等等...对不起这个愚蠢的错误。
      【解决方案5】:

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

      【讨论】:

        【解决方案6】:

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

        【讨论】:

          【解决方案7】:

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

          从 endolith 的回答中分离出来,我决定这样做:

          [>=1E6] #,##0.0,,"M";[>1E3] #,##0.0,"K";0.#####################
          

          它适用于从 1 到

          文档:https://developers.google.com/sheets/api/guides/formats#number_format_patterns

          【讨论】:

            【解决方案8】:
            ' 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
            

            【讨论】:

            • 您能否根据 SO 指南添加一些关于这是什么以及如何使用它的评论?
            • 对不起,我不确定你的问题是什么。另外,什么是SO,你是说SI吗?代码用于 Excel,来自 cmets。
            • SO 是堆栈溢出 :) 如果您查看指南,通常不赞成仅代码的答案。如果您对答案进行编辑以解释可以使用它,我们将不胜感激。这是一个宏 - 放在哪里,如何将它链接到问题中的工作表。
            • 完成。花了半个小时左右的时间。
            猜你喜欢
            • 1970-01-01
            • 2012-07-05
            • 1970-01-01
            • 2019-08-31
            • 2021-09-11
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多