Запятая, которая увеличила все европейские цены в 100 раз

Парсер цен, который удалял запятые, прочитал немецкое 9,99 € как 999. Ничего не сломалось, ничего не выглядело неправильно, и модель дохода тихо сообщала цифры в сто раз больше.

Цены — это единственный вход, где ошибка на порядок выглядит на графике совершенно правдоподобно. Подписочное приложение, показывающее $6,499 в год, абсурдно, если задуматься, и совершенно непримечательно, если просто просматривать дашборд.

Что делал код

Парсер удалял разделители тысяч перед сопоставлением цифр, что корректно для английского и неверно для большей части Европы. Немецкий стор печатает 9,99 €, запятая — десятичная точка, и её удаление даёт 999.

Поскольку модель дохода считывает ценовую лестницу с того стора, который сейчас на экране, открытие отслеживаемого приложения на немецкой вкладке подставило ему якорную цену 6,499 вместо 44.36. Завышение в 147 раза, без ошибки, без предупреждения и без видимых симптомов.

Исправление и почему определение локали было неверным ответом

Очевидное исправление — посмотреть стор и применить его соглашение. Мы этого не сделали, потому что парсеру также передаются строки, происхождение которых он не может знать наверняка, а поиск, молча откатывающийся к английскому, воссоздаёт ошибку в более труднонаходимой форме.

Вместо этого десятичный разделитель определяется позицией. Если встречаются и точка, и запятая, самая правая считается десятичной точкой: 1.234,56 и 1,234.56 разбираются корректно, и невозможно понять, из какой они страны. Если встречается только один, он считается разделителем тысяч, когда за ним ровно три цифры, и десятичной точкой в остальных случаях.

Та же ошибка, но с другим суффиксом

Затем Индонезия. Apple печатает 829,000 рупий как "Rp 829ribu", где ribu по-индонезийски означает тысячу. Если читать буквально, это 829 рупий, около пяти центов США, что против американской цены $69.99 было бы опубликовано как самая драматичная находка локализации на экране.

Слова-величины теперь обрабатываются. Но эта таблица никогда не будет полной, потому что любой стор может напечатать слово, которое никто на нашей стороне не видел, поэтому есть и нижний порог: цена, конвертирующаяся менее чем в 2% от базового рынка, не публикуется как ненадёжная. Самый дешёвый реальный рынок, который мы измеряем, Турция, находится на уровне 5%, так что защита отлавливает ошибки на порядок, не подвергая сомнению реальное ценообразование.

Похожие

Блог · Кейсы · Free ASO tools · Продукты · Конфиденциальность и условия · AsoTheory