1. JavaScript / Говнокод #20119

    +2

    1. 1
    $ npm install ember-cli-phone-number --save-dev

    Всё достаточно просто. Нам нужен текстовый инпут, в который пользователь вводит свой номер мобильного телефона. Предназначение: sms-оповещение. Проблема в том, что все существующие решения привязываются к определённому формату номера (US, Canada), а при использовании международного формата для US-номера выясняется, что в нём 11 цифр, а не 12. Пользователь же может иметь номер хоть в ёбаном Вануату. Текущее решение: принимать любой текст в инпут, делать .replace(/[^0-9]/g, ''), схоронять в базу и ебаться с этим потом. Чувствую запашок, но не могу понять откуда. Швабрашвабр про телефонные номера читал. inb4, js не нужен.
    Запашок наверное всё-таки от стандартов телефонных номеров...

    Запостил: bakagaijin, 01 Июня 2016

    Комментарии (40) RSS

    • не понял в чем проблема. это типа в базе слишком короткое поле?

      телефонные номера разрешены до 64 цифр, плюс хез-из-еще-тех-старых-модемных-времен (я знаю: пробел (пауза), запятая (длиная пауза), тире (игнорируется), хэш (что-то там посылает)). но для мобильников можно упростить (так как они не поддерживают эту PTSN хуету) до: потенциально первый плюс, и до 64ех цифр. НО: смс можно посылать и на PTSN, не-мобильный номер (в куче стран это типа функционирует).
      Ответить
    • Нет, тут скорее UI вопрос: валидировать ли это поле, делать ли няшные плейсхолдеры и т.п.
      Но из-за говняного подхода к стандарту телефонных номеров всё это летит коту под хвост.
      Ответить
      • не только валидировать, но и игнорировать любые символы, кроме цифр и ведущего плюса, прямо в маске пользовательский ввод рисовать (показывая ему кот страны/города в скобочках и т.д.)
        Ответить
        • ...И тут мы плавно приходим к тому, что в зависимости от первых цифр надо менять маску. Потому что варьируется и количество цифр, и принятая для страны группировка. Что-то многовато телодвижений для рядового инпута. А на меня, как на человека, привыкшего к порядку, удручающе действует бардак с форматом телефонных номеров.
          Ответить
          • мы просто буквально недавно эту же задачу решали
            временно смирились с тем, что код города будет 3 символа
            нет ничего идеального
            Ответить
            • На самом деле есть отличный компонент, который умеет (http://justin-lau.github.io/ember-intl-tel-input/, авось пригодится). Но чтобы всё работало красиво, надо за собой тащить libphonenumber, который за собой тащит ещё что-то. В результате для рутинного, казалось бы, действия добавляется столько какой-то хуиты... А потом я не могу открыть на своём трёхлетнем телефоне сайт какой-нибудь ссаной пиццерии, чтобы заказать еды.
              Ответить
              • > авось пригодится
                разве что тем, кто завязан на ембер
                Ответить
                • А это враппер для $-плагина http://jackocnr.com/intl-tel-input.html, можно прикручивать куда угодно.
                  Ответить
              • то о том вы тут мучаетесь, обобщенно, называется "нормализацией телефонных номеров" и дженерик решения нет, потому что как вы и указали ранее, в разных странах все по разному, у разных телек. фирм это по разному.

                в телекомщине эту проблему решают в лоб: конфигурируемый список стран + список мобильных операторов и/или кодов городов. я слышал что поддержка этой таблички это коллективная добровольная работа сотрудников телеком фирм. (точно не помню, но табличка и не такая уж и большая - несколько тысяч строк.)

                и тут стоит подчеркнуть: эти данные не статические, они со временем меняются и их нужно апдейтить.

                FYI
                Ответить
                • и я до сих пор понять не могу накой хер вы пытаетесь это парсить. чем просто opaque string не подходит?
                  Ответить
                  • чтобы потом искать одинаковые телефоны, наверное
                    Ответить
                    • Для этого достаточно из телефона выкинуть все пробелы, минусы, скобки, запятые и прочие знаки препинания, кроме ведущего плюса.

                      Правда, если номер не в международном формате, придётся его приводить в международный. В России, например, вместо ведущей восьмёрки придётся добавить +7. Если же номер местный, расположенный в данной области, придётся ведущую двойку в коде города заменить на код области (например, номер 8-261-23456 нужно привести к 8-49661-23456, а потом к +74966123456, если абонент расположен в Московской области, где 496 — код области). Но внутриобластной номер — это подстава, потому что его нельзя привести к общероссийскому и к международному, не зная кода области, поэтому проще будет запретить вводить неглобальные номера.

                      Да, есть трудности, связанные с несколькими форматами международных номеров (типа +78001234567 = 8-10-7-800-1234567 = 8-800-1234567 в России или с ведущими ноликами (какими-нибудь ещё цифрами) в других странах), но обычно нормализация номера всё же проще, чем красивое форматирование со всеми скобочками и дефисами и тем более чем «интеллектуальная» валидация всех этих знаков препинания прямо в поле ввода.

                      Тут примерно как с е-мейлом: чтобы проверить валидность е-мейла, нужно отправить на него письмо.
                      Ответить
                      • однако, при этом замена 8-800 на +7-800 не работает
                        по крайней мере когда я попытался так позвонить через своё мегафно на один из заведомо рабочих 8-800 номеров, мне сказали, что "неправильно набран ном что ты творишь чудовище блядь!!"
                        Ответить
                        • Значит, в общем случае лучше ничего никуда не переводить, а добавить метаданные, поясняющие, как именно можно употребить этот номер?
                          Ответить
                          • вполне вероятно, что это просто сраный мегафон не может в +7800
                            подождём специалистов в тред

                            олсо мы тут номер телефона заюзали в т.ч. под логин (одна из возможностей)
                            поэтому
                            > выкинуть все пробелы, минусы, скобки, запятые и прочие знаки препинания, кроме ведущего плюса
                            и прочая нормализация очень нужна, чтобы номер телефона был реально уникальный и отличимый от юзера к юзеру
                            Ответить
                        • > замена 8-800 на +7-800 не работает
                          Х.з. Я, помнится, в канал вышестоящего провайдера гнал все номера в международном формате, и 8-800 работало. Видимо - у кого как правила настроены.
                          Ответить
                        • конечно не работает

                          8 800 это только для российских клиентов
                          как бы вы сделали его бесплатным, если б он со всем мира был доступен?
                          Ответить
                          • эм
                            прежде всего мой набранный номер попадает к моему оператору, а тот уж наверняка знает, что такое +7495, чтобы протарифицировать по местным звонкам, и что такое +7926, чтобы протарифицировать по внутрисетевым. Он же не снимает с меня, как международный звонок в РФ

                            так какого хера ему бы не знать про +7800 и как его тарифицировать, тем более, что 8800 он знает!
                            Ответить
                      • Exactly, но если я отправлю смс на номер 80297777777 из штатов, я получу хуй.
                        И я уже запарился переводить номера хостов арендованных квартир с airbnb в международный формат, по которому я смогу позвонить из роуминга. Через раз нужно гуглить, что же означают эти цифры в скобках.
                        Ответить
                        • И да, тут соль в том, что нужно хранить нормализованный номер, на который смс уйдет отовсюду и всегда. Положился на модуль, про который писал выше. Он тянет с собой эдакий аналог tzdata. Через три года половина правил будут невалидными, но кого это волнует... Кстати, белорусские номера он форматирует криво.
                          Ответить
                          • И вообще приятно увидеть конструктив в треде. Это ж блядь всеобщая проблема, а всё равно пилятся велосипеды. 21 век...
                            Ответить
      • > делать ли няшные плейсхолдеры

        Плейсхолдеры, которые нельзя реализовать HTML5-атрибутом placeholder, не нужны.
        Ответить
        • Расскажите это кастомеру, который платит деньги и которого не волнуют всякие глупые аббревиатуры. Был бы pet project, у меня бы не подгорало.
          Ответить
        • да-да, я как-то завязался на это
          и еще календарь заюзал

          а потом пользователь снес хром, и запустил IE
          и весь мой HTml 5 по песде пошел

          именно потому во сякиах там ASP.NETах для эоого есть конторолы
          на старом, добром жопаскрипте
          Ответить
          • а потом пользователь снес хром, и запустил IE
            Ты, идиот, ещё хуй себе отрежь, а потом жалуйся, что не стоит.
            Ответить
    • Просто оставлю:
      https://ru.wikipedia.org/wiki/Телефонный_план_нумерации

      Да, это обсуждалось и в Хабрахабре, и здесь. Так, ещё один источник вореций и кобенаций.
      Ответить
    • А что, чего-нибудь наподобие tzdata, только для телефонных номеров, нет?
      Ответить
    • Чет не врублюсь в проблему. У нас номера дают или в международном формате (+49), или без кода страны с ведущим нулем (выход на междугород).
      Ответить
      • Заебись у вас. У них бывает вот так: http://stdcxx.apache.org/doc/stdlibug/26-1.html
        Конечный пользователь тупой, он не хочет что-то куда-то переводить, он хочет вбить телефон и получить фырфырфыр.
        Ответить
        • У кого у них, объясни мне. Что мешает запрашивать номер в международном формате, самому предлагая пользователю код текущей страны?

          Интернациональный номер работает везде. У нас номера с двумя нулями перестали указывать в середине двухтысячных.
          Ответить
          • Оно как бы не мешает. Как я уже писал выше, есть способ получить нормализованный международный телефонный номер. Это работает, хоть и тянет за собой дополнительные зависимости. Я о том, что в 21 веке всё ещё нет повсеместного использования международных номеров, а есть всякое с 8, 0, и т.д. и т.п.. И в принципе это можно отнести к говнокоду. У инкануса хороший комментарий, развёрнутый.
            Ответить
            • >в 21 веке всё ещё нет повсеместного использования международных номеров
              Хз, у нас есть. Во вконтакте тоже.
              Ответить
    • > Нам нужен текстовый инпут, в который пользователь вводит свой номер мобильного телефона.
      А обязательно текстовый? https://i.imgur.com/Jfv6F2r.png

      (там потом была эпидемия троллинга на эту тему: https://twitter.com/paulomgaspar/status/722138976480571394
      )
      Ответить
      • Вот это и вот это неплохо:
        https://pbs.twimg.com/media/CgWNknfWQAEukz2.jpg
        https://pbs.twimg.com/media/CgXVgG-W8AAwpV3.jpg
        Ответить
        • Самая крутая была змейка где нужно "съедать" цифры номера, но ее я никак найти не могу :(
          Ответить
      • Откуда вы такие приколы берете?
        Ответить
      • Я надеялся увидеть контрол в виде дискового номеронабирателя...
        Ответить

    Добавить комментарий