Кома, яка збільшила кожну європейську ціну в 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