數字格式化

自訂千分位、小數位數與科學記號格式

格式化結果
1,234,567.89

1234567.89 放進報表沒有人願意讀,1,234,567.89 就好多了;而同一份數字寄給德國客戶時,正確的寫法又變成 1.234.567,89。這個工具把千分位符號、小數點符號、小數位數與科學記號四個開關攤在畫面上,改哪一個結果就立刻跟著變,不必進試算表翻儲存格格式選單。要先提醒的是它讀入數字的規則相當寬鬆,寬鬆到有幾種常見寫法會被無聲地讀錯,那部分寫在下面的注意事項。

使用步驟

  1. 在「輸入數字」欄位打字或貼上。這一格預設就帶著 1234567.89 當範例,直接改掉即可,提示文字是「例如:1234567.89」。
  2. 「千分位分隔符號」下拉有四個選項:逗號 (,)、句點 (.)、空格 ( )、無。
  3. 「小數點符號」下拉有兩個選項:句點 (.) 與逗號 (,)。
  4. 「小數位數 (0–10)」是數字欄位,超出範圍會被立刻拉回邊界——打 20 會變成 10、打 -3 會變成 0。這一格不能留白,把內容刪光會直接顯示 0。
  5. 勾選「科學記號表示法」之後改用指數格式輸出,此時「小數位數」控制的是尾數要留幾位。
  6. 「格式化結果」在最下方即時更新,沒有執行按鈕,右邊有一顆複製按鈕。輸入解析不出數字時,結果區顯示一個破折號 —。

什麼時候用得上

把數字排成報表看得懂的樣子

報價單的金額、月報的營收、儀表板上的計數器——三位一撇加上固定兩位小數是最常見的組合,也正好是這個工具的預設值。調完直接複製貼回簡報或文件,比在試算表裡改格式再想辦法把「顯示值」而不是原始值複製出來簡單得多。

換成收件方所在地的寫法

德國、西班牙、巴西的慣例是句點當千分位、逗號當小數點;法國與多數 SI 文件用空格分組;英美則是逗號加句點。同一批數字要寄給不同地區的人時,把兩個下拉調成對方的慣例再複製,比事後在信裡解釋「那個點是千分位不是小數點」省事得多。

統一一批來源不同的數字

從三個系統匯出來的數字,常常一個帶三位小數、一個五位、一個是整數。設好「小數位數」逐一過一遍,輸出的位數就會一致,貼成表格時小數點才對得齊。要注意這是真的四捨五入,不是只改顯示方式。

把帶符號的數字洗乾淨

從網頁或 PDF 複製下來的 $1,234.56、NT$ 89,000 這種字串貼進來,貨幣符號與逗號都會被忽略掉,再把千分位選「無」,就得到可以直接餵給程式的純數字。這是輸入規則寬鬆帶來的意外好處——但同一條規則也是下面那幾個坑的來源。

限制與注意事項

  • 讀入的規則是先刪再解析:輸入字串裡所有不是 0–9、.、- 的字元會先被清掉,剩下的部分才拿去解析成數值。這說明了為什麼 $1,234.56 能被正確讀成 1234.56——錢字號和逗號都在清除之列。
  • 同一條規則會讓歐陸寫法無聲算錯。1.234,56 被清成 1.234,讀成一點多,兩位小數之下輸出 1.23;用空格分組的 1 234,56 更嚴重,清完變成 123456,讀成十二萬多,數量級整整差了一千倍。兩種情況都沒有任何提示。矛盾的地方在於這個工具自己就能輸出這兩種寫法,卻讀不回自己產出的東西:把它輸出的 1.234.567,89 原封不動貼回輸入欄,結果是 1.23。要處理歐陸格式的數字,請先手動把分隔符號改成英美式再貼進來。
  • 指數寫法的輸入同樣會被吃掉。e 不在保留的字元裡,所以 1e5 被清成 15,輸出 15.00;1e21 會變成 121.00。從 Python、R 或試算表複製出來的數字常帶著指數寫法,貼之前請先展開成完整位數。
  • 勾了「科學記號表示法」之後,兩個分隔符號下拉就不再生效。這個模式輸出的是解析後直接產生的指數字串,千分位不會插入、小數點固定是句點。此時「小數位數」控制的是尾數的位數:設 0 會得到 1e+6,設 10 會得到 1.2345678900e+6。
  • 兩個下拉可以被選成同一個符號,程式不會攔也不會提示。千分位選句點、小數點維持預設的句點,結果是 1.234.567.89,沒有人讀得出來哪一個才是小數點;兩個都選逗號則會得到 1,234,567,89。設定完請看一眼結果區再複製。
  • 位數處理走的是二進位浮點數的四捨五入,看的是實際存下來的值而不是你打進去的十進位字面值。1.005 取兩位小數會得到 1.00 而不是 1.01,2.675 得到 2.67,因為這兩個十進位小數在二進位裡存的是略小一點的值;而 0.005 則會進位成 0.01。財會金額請在後端用十進位型別算完進位再拿來排版,不要讓這裡決定最後一位。
  • 10^21 以上的數值會直接吐出指數寫法,即使科學記號沒有勾。產生固定位數字串的那個函式對這種量級回傳的本來就是指數格式,千分位規則對它不生效,所以貼一個 24 位數進去,結果區照樣出現 1.2345678901234569e+23。同時也提醒你:那個數字早就超過 2^53 - 1,尾端幾位已經不是你輸入的內容了。
  • 只認半形阿拉伯數字。全形的 123 與阿拉伯文的 ١٢٣ 都會在清除階段被整串刪光,剩下空字串,結果區於是顯示破折號而不是錯誤訊息。從 Word 或舊報表複製過來的全形數字,請先用文字類工具轉成半形。
  • 解析只取得到的第一段數字。清除之後的字串若仍然不是一個合法數值,解析會在看不懂的字元處停下並回傳前面那一段:1.2.3 讀成 1.2、1-2 讀成 1,兩者都不報錯。減號只有擺在最前面才有意義,夾在中間的會被當成雜訊。
  • 選「空格 ( )」時插入的是一般的半形空格 U+0020,不是排版上用來分位的窄不斷行空格 U+202F。實際差別是這個空格可以斷行,一個數字可能被換行拆成兩半;匯入試算表時也要留意,以空格分位的數字常會被判定成文字而不是數值。
  • 這裡不處理單位、貨幣與百分比。沒有加貨幣符號、沒有百分比、沒有負數變色、沒有中文的「萬/億」單位,也沒有印度計數法的 2,34,567 這種三位以外的分組方式。畫面上就是那四個開關,需要完整的在地化格式請在程式裡用 Intl.NumberFormat。
  • 格式化完全在你的瀏覽器裡完成,輸入欄的內容沒有被送到伺服器,也沒有被暫存起來。另外要交代的是,這個頁面會載入廣告等第三方資源,那些請求帶的是版位與頁面資訊,跟你正在排版的數字無關。

常見問題

我把德文格式的金額貼進來,算出來完全不對,怎麼辦?

先把它改寫成英美式再貼。這個工具在讀入時只承認句點是小數點,看到 1.234,56 會把逗號當雜訊刪掉,剩下的 1.234 就被讀成一點多。實務做法是在編輯器裡先把千分位的句點刪掉、把當小數點用的逗號換成句點,貼進來之後再用兩個下拉把輸出調回歐陸格式——輸入用英美式、輸出用歐陸式,這個工具是這樣用的。

小數位數設 2,為什麼 `1.005` 變成 `1.00`?

因為 1.005 這個十進位小數沒有辦法用二進位精確表示,實際存進去的是 1.00499999999999989 左右,四捨五入到第二位當然往下走。這不是這個工具的取捨規則有問題,任何使用 IEEE 754 雙精度的環境(JavaScript、Python 的 float、Java 的 double)都會得到同樣的答案。需要符合會計規範的進位,請用十進位型別算好再送過來排版:Python 的 Decimal、Java 的 BigDecimal、SQL 的 NUMERIC。

可以只清掉貨幣符號和逗號、其他保持原樣嗎?

可以清,但沒辦法「原樣」。把千分位選「無」就得到不含分隔符號的數字,不過「小數位數」永遠會生效,它會補齊或四捨五入,沒有「跟輸入一致」這個選項。所以 $1,234.5 在兩位小數之下會變成 1234.50,在 0 位小數之下會變成 1235。想保留原本的位數,只能自己數一下再把那一格設成同樣的數字。

勾了科學記號之後,我選的逗號小數點跑哪去了?

沒有跑掉,是那個模式根本不看那兩個下拉。指數輸出由另一條路徑產生,回傳什麼就顯示什麼,小數點固定是句點,也不會插入任何千分位符號。要歐陸格式的指數寫法(1,23e+6)這裡做不到,得複製出去之後自己把句點換成逗號。

小數位數可以設超過 10 位嗎?

不行,這一格被夾在 0 到 10 之間,打 15 會在放開按鍵後立刻被改成 10。上限來自介面而不是底層能力,不過實務上也夠用了:雙精度浮點數大約只有 15 到 17 位有效數字,0.1 設成 10 位小數會得到 0.1000000000,再往後的位數已經是浮點數表示的雜訊,不是你的資料。

為什麼結果區只有一個破折號?

表示清除之後解析不出任何數值。最常見的原因是輸入欄是空的、整串都是文字、打的是全形數字、或者只輸入了一個減號。補上半形數字就會恢復顯示。這一格不會顯示錯誤訊息,破折號本身就是「沒東西可算」的意思。