讓每個歐洲價格膨脹 100 倍的逗號
一個價格解析器去除了逗號,將德文的 9,99 € 讀成 999。沒有崩潰,看起來沒有問題,但收入模型悄悄地報告了比實際大一百倍的數字。
價格是唯一一個在圖表上看起來完全合理的數量級錯誤輸入。一個訂閱 App 顯示每年 $6,499,如果你停下來想一想會覺得荒謬,但如果你正在掃視儀表板,就完全不會覺得奇怪。
程式碼做了什麼
解析器在比對數字前會先移除千位分隔符,這對英文是正確的,但對歐洲大部分地區是錯的。德國商店印出 9,99 €,逗號是小數點,移除它會產生 999。
因為營收模型會從畫面上顯示的商店讀取價格階梯,所以在德國分頁開啟一個受追蹤的 App 時,它會餵入 6,499 而非 44.36 作為錨定價格。147 倍的誇大,沒有錯誤、沒有警告,也沒有任何可見的症狀。
修復方式,以及為什麼地區偵測是錯誤的答案
明顯的修法是查詢商店並套用其慣例。我們沒有這麼做,因為解析器也會收到無法確定來源的字串,而一個默默退回英文慣例的查詢,會以更難發現的形式重現這個錯誤。
相反地,小數分隔符是由位置決定的。如果同時出現點和逗號,最右邊的就是小數點:1.234,56 和 1,234.56 都能正確解析,但完全不知道它們來自哪個國家。如果只出現一個,當它後面剛好有三個數字時就是千位分隔符,否則就是小數點。
同一個錯誤,換了不同的後綴
然後是印尼。Apple 將 829,000 印尼盾印成 "Rp 829ribu",其中 ribu 是印尼文的「千」。照字面讀就是 829 印尼盾,大約五美分,對比 $69.99 的美國價格,這會被發布成畫面上最戲劇化的在地化發現。
數量級詞語現在已處理。但那張表永遠不可能完整,因為任何商店都可能印出我們這邊從未見過的詞,所以還有一道底線:換算後低於基準市場 2% 的價格會被視為不可靠而不發布。我們測得最便宜的真實市場是土耳其,位於 5%,所以這道防護能攔下數量級錯誤,而不會質疑真實定價。