用 Excel 公式從文字中擷取數字,通常意味著一連串 TEXTJOIN、MID、ROW、INDIRECT 與 IFERROR 函數,巢狀套用在陣列公式中——而且即使能順利執行,也無法區分 $19.99 與 19.99、1,000,000 與三個獨立的數字,或是 5-3 與 -5。之所以有這麼多人搜尋這類公式最後都失望而歸,是因為 Excel 內建函數的設計是用來處理「已定義資料類型」的儲存格,而不是用來解析任意的文字內容。從文字中擷取數字是一款專為此用途打造的瀏覽器工具,正確地完成這項解析工作,並提供明確的開關來控制正負號、小數點、千分位分隔符號、科學記號,以及去重複處理,還內建一個統計區塊,可計算總和、數量、最小值、最大值與平均值。它完全在你的瀏覽器中執行,所以不會上傳任何資料,擷取出的數字會依據你所選擇的輸出模式,以逐行一筆、逗號分隔清單,或統計摘要的形式回傳。

excel formula to extract text from numbers
excel formula to extract text from numbers

為何 Excel 擷取數字的公式總是漏洞百出

傳統的做法是使用 MID 逐一走訪每個字元,再利用 ISNUMBER 判斷該字元是否為數字,最後用 TEXTJOIN 把符合的結果串接起來。實際的公式如下:

=TEXTJOIN("",TRUE,IFERROR((MID(A1,ROW(INDIRECT("1:"&LEN(A1))),1)*1),""))

它能在純粹的數字字串上正常運作,但對於數字周圍的內容卻完全沒有判斷能力。它無法分辨一個減號到底是數字的一部分,還是算術運算式中的減法運算子。它會把每個逗號都視為分隔符號,所以 1,000,000 會被拆成三段斷掉的數字。它會去掉錢號,但卻不知道 US $ 31330.00 應該是一個完整的數字,而不是某個分數。它會默默地略過以科學記號表示的數字,而且無論是向下複製到整個欄位,或是在輸入格式改變時進行修正,都需要相當程度的儲存格維護工作。

對於日常工作就是從發票、問卷匯出檔、記錄檔或一次性的大段文字中抽取出數字的人來說,一個每次輸入一變就要重新修復的公式,根本不是合適的工具。較好的做法是採用一套規則明確、可切換、且經過文件化測試案例驗證的解析器——也就是 Excel 並未內建的那種解析器。

真正決定「什麼才算一個數字」的三條規則

每一個數字擷取器都必須回答三個問題:數字從哪裡開始、在哪裡結束,以及那些看起來像數字但其實不是的東西該怎麼處理。這款瀏覽器工具以明確的規則開關來回答這些問題,而不是依賴隱藏的假設。

規則範圍預設行為是否可切換
正負號減號只在附加於數字時才會保留——也就是位於行首、空白之後,或左括號、比較運算子之後是(正負號開關)
小數可辨識整數、小數、負值、前置加號,以及像 .5 這類獨立的小數是(小數開關)
千分位分隔符號格式正確的分組(1,000,000)算一個數字;格式錯誤的分組則在錯誤處切開是(分隔符號開關)
科學記號預設為關閉,因為在文字內容中 1e5 通常是打錯字或識別碼,而非十萬是(科學記號開關)
去重複重複出現的值會依照首次出現的順序保留是(去重複開關)
字元範圍僅限 ASCII 數字;全形數字以及其他文字系統的數字符號會原樣通過而不被擷取範圍固定,並於頁面上標示

上表就是這份合約。頁面上每一次擷取都遵循它,舉例來說,處理減號的規則,也就是處理測試案例 5-3 時所使用的那一條。沒有任何隱藏在旗標背後的第二種解讀。

如何在三個步驟內從貼上的文字中擷取數字

這個工具只要三個簡短的步驟就能執行,無論你貼上多大篇幅的內容,同樣的三個步驟都適用。

  1. 把含有你想擷取之數字的文字貼到輸入框中。
  2. 視需要調整規則:正負號、千分位分隔符號、科學記號,以及去重複處理。預設值已可處理大多數常見情況。
  3. 選擇清單或統計輸出模式,檢查找到的數量,然後複製結果。

每一次擷取都會回報找到了幾個數字,所以在複製出去之前,輸出結果就能對照你的預期進行稽核。如果數量看起來偏少,最可能的原因是某條規則對你的輸入來說太嚴格——只要切換對應的開關,數字就會重新出現。如果數量看起來偏多,表示該規則對這份資料來說太鬆,把同一個開關切回去即可。

在同一頁面內從清單轉為統計資料

一旦數字擷取出來,你不一定要把它們複製到 Excel 才能看出端倪。統計輸出模式會從同一組數字回傳數量、總和、最小值、最大值與平均值,並在瀏覽器中以一般的 JavaScript 雙精度浮點數運算完成。

統計項目意義說明精度備註
數量擷取出的數值總數永遠精確
總和所有擷取數值的合計雙精度浮點數;在第 15 位有效數字可能帶有殘差
最小值這組數字中的最小值精確
最大值這組數字中的最大值精確
平均值總和除以數量與總和相同的殘差,並會一併傳遞

數量是精確的,因為完全不涉及四捨五入。總和與平均值可能帶有你在試算表合計中曾經見過的浮點數殘差:0.1 + 0.2 會顯示為 0.30000000000000004 而不是 0.3。對於發票總額、記錄檔的數值,以及量測範圍來說,這種誤差根本看不出來。頁面對這項限制據實以告,且只有在第十五位有效數字才會產生影響,這早已遠超過大多數貼上文字中數字實際會觸及的有效位數。

工具明確處理的特殊情況

有幾種輸入會讓臨時湊出來的擷取器踢到鐵板。這個工具對每一種情況都以文件化的規則來處理,而非憑感覺猜測,而這些規則正是解析器測試案例所依據的依歸。

輸入文件化規則
5-3得到 5 和 3,而非 5 和 -3,因為這個減號並未附加於其後的數字
1,000,000當分組格式正確且千分位分隔符號開關開啟時,算作一個數字
1,00,000在格式錯誤的分組處切開
$19.9919.99
50%50
item123123

以上都是已文件化的行為,而不是工具偶爾才會處理對的特例。頁面把這些行為列為規則合約的一部分,而解析器由超過二十個隨實作一起交付的測試案例所把關,因此頁面上的規則就是工具實際套用的規則。

一個快速的實際操作範例

要看這些規則實際運作的情形,請把以下這段簡短內容貼到工具中:

Order #12345 paid $19.99, change 0.01, total -5 (sample)

使用預設規則時,擷取出的清單為:

  • 12345
  • 19.99
  • 0.01
  • -5

四個數字,回報的數量為 4。-5 的前導負號之所以被保留,是因為它出現在空白之後。錢號、"paid" 這個字、沒有百分號的小數,以及結尾括號中的內容,全都會被捨棄,而不會干擾到旁邊的數字。開啟統計模式後,同樣的輸入會回傳:數量 4、總和 12360.00、最小值 -5、最大值 12345、平均值 3090.00。這些精確數值來自於工具本身——貼上同一行內容自行驗證即可。

該選 Excel 公式還是瀏覽器工具?

如果只是單一儲存格的純文字,Excel 陣列公式還算堪用,也有不少不錯的教學文章可參考。但如果是一次性的貼上內容,混雜了貨幣、百分比、識別碼與算術運算式,公式就會開始與你為敵。這個工具完全跳過公式,改為將輸入視為純文字,套用文件化的規則,並回傳乾淨的清單,或是可以直接貼入試算表的即時統計區塊。

對於想避開公式來處理其他文字工作的 Excel 使用者而言,同一個網站也提供了在 Excel 中不用公式計算文字出現次數的指南,採用相同的「工具優先」作法。

「從文字中擷取數字」屬於一個小型擷取工具家族的一員,該家族還涵蓋了電子郵件、網址與電話號碼的擷取。每一個工具都在本機執行,採用相同的單次掃描與同樣可稽核的數量回報機制,每一個工具也都由同類型的測試案例加以文件化,把數字文法的規則牢牢釘住。

延伸閱讀:如何在 Excel 中不用公式進行尋找與取代文字