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

    +165

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    function CheckNumField(value)
    {
        for(var i=0; i<value.length; i++)
        {
            switch(value.substr(i,1))
            {
                case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '.':
                    return true;
                break;
                default:
                    return false;
                break;
            }
        }
    }

    Проверочка текстового поля...

    Запостил: webelancer, 13 Сентября 2013

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

    • Пахнет неосиленными регулярками.
      Ответить
    • Согласно коду, 2 6, 6Y и .ммм - числа, как ни верти...

      Только что-то тут лишнее: или return, или последующий break.
      Ответить
      • break - чтоб корректно завершить цикл
        Ответить
        • И default для отслеживания всех неподходящих символов и оперативного вмешательства.
          Ответить
      • Переложите одну спичку строчку, чтобы код начал работать правильно.
        Ответить
        • З.Ы. Ну почти правильно, не проверяя, что точка встречается не более 1 раза.
          Ответить
        • return true;
          переносим в качестве дефолтного ретурна в конец функции.

          З.Ы: верно замечено - останутся случаи вида 666.66.666.
          Ответить
        • Как-то так:
          function CheckNumField(value) {
              return /^\d+(\.\d+)?$/.test(value);
              ...


          Правда я тут "доложил" до общей кучи ;)
          Ответить
          • Блин, вот какого ж хрена parseFloat считает "1.5всякиймусор" числом... Если бы не считал - достаточно было бы return !isNaN(parseFloat(value)).
            Ответить
            • return /^\d+(\.\d+)?$/.test(value) && !isNaN(parseFloat(value));

              А почему бы их не применить вместе? :) Я бы еще добавил ^-? в регулярку, чтоб парсить отрицательные числа, но в ОП этого нет.
              Ответить
              • А зачем их применять вместе? То что слева всяко проканает под то что справа (если добавить ограничения на количество цифр дабы избежать переполнения).

                Если что-то и добавлять, то тест на попадание в диапазон допустимых значений. Например от 0 до 100.
                Ответить
                • Да, я подумал о переполнении, но тут еще надо проверять isFinite
                  Ответить
                  • Ну если диапазон на вменяемость проверять (а его стоит проверить), то isFinite не надо.
                    Ответить
          • -1, -1.1e-1, NaN, -Infinity...
            Ответить
            • Ну Infinity и числа в scientific формате в 99.9% случаев на входе не нужны, если это не какая-то математическая считалка. NaN тем более.

              Отрицательные числа - ну зависит от задачи. Если это какая-то цена или количество, то явно не нужны.
              Ответить
              • Но parseFloat их тоже узнает.

                Да, и еще, в ж.скрипте можно флоаты записывать так: .123456, т.е. без ведущего нуля.
                Ответить
                • Да parseFloat и "1.5хуйпиздаджигурда" числом считает ;(

                  Если бы не считал - на NaN была бы проверка isNaN, +-Infinity и слишком большие числа с экспонентой срезались бы проверкой на диапазон. ".123456" особой угрозы не представляет.
                  Ответить
          • Регуляяярки? Только конечные автоматы, только хардкор!
            Ответить
            • > Регуляяярки
              > конечные автоматы
              Емнип, если верить теории, они эквивалентны ;)
              Ответить
              • В теме про парсинг html регулярками кто-то написал, что некоторые дотягивают до машины Тьюринга, поэтому я не понял 4к плюсов первому говнокоменту.
                Ответить
                • > некоторые дотягивают до машины Тьюринга
                  Ну это какой-нибудь perl6. А классические регулярки эквивалентны конечному автомату (и обычно в него и компилируются). Поэтому ими и нельзя вменяемо парсить рекурсивные структуры типа XML и HTML.

                  > про парсинг html регулярками
                  Зачем это делают в век xpath? :)

                  > 4к плюсов первому говнокоменту
                  Речь об этом комменте? "Согласно коду, 2 6, 6Y и .ммм - числа, как ни верти..."
                  Ответить
                  • Зачем это делают в век xpath? :)

                    а это от задачи зависит отдельный фаил проще выкалупать регеспом
                    Ответить
                    • Да ну. В xpath выборки наглядней и короче получаются.

                      Другое дело что далеко не все DOM либы умеют парсить кривожопый HTML (в отличие от кошерного XML). Скорее всего в этом и причина.
                      Ответить
                    • Пример из моей govnotify:
                      String author = xpath.evaluate(".//strong[@class='entry-author']/a/text()", node);
                      String language = xpath.evaluate(".//a[@rel='chapter']/text()", node);
                      String topicUri = xpath.evaluate(".//a[@rel='bookmark'][@class='entry-title']/@href", node);
                      Регулярками всяко будет не проще.
                      Ответить
                      • Одна из регулярок из моего парсера говнокода:
                        // commentRE = userid, username, date, id, rating
                        var commentRE = /<strong\sclass="entry-author">.*?govnokod\.ru\/user\/(\d+)">(.*?)<\/a>[\s\S]+?<abbr\sclass="published"\stitle="(.+?)"[\s\S]+?#comment(\d+)[\s\S]+?(<strong\sclass="just-rating.*?<\/strong>)/g;

                        Говнисто, длинно и недостаточно корректно. (Но написать это быстрее, чем возиться с парсерами)
                        Ответить
                        • > Но написать это быстрее, чем возиться с парсерами
                          Я хотел полноценное API делать, с блекджеком и отправкой, поэтому и начал возиться с парсером. Писать регулярки для выдирания всей инфы со всех вариантов страничек было бы сизифовым трудом... Но на API я забил из-за вселенской лени, и от него осталось только говнотифи ;)

                          > чем возиться с парсерами
                          С парсером возиться 1 раз, пока не распарсишь им свою первую хтмлку. Дальше - на порядки легче :)

                          Ну а так - не спорю, для одноразового парсинга регулярки вполне сойдут.
                          Ответить
                        • \Q \E ?
                          Ответить
                  • >Зачем это делают в век xpath? :)
                    Выковырять содержимое одного тега регуляркой тоже несложно и работает быстрее. И юзать регулярки поначалу действительно проще, чем в первый раз разобраться с xpath. xpath нужен там, где нужно именно дерево. Ну и недавно был пиздец, когда я чистил html регулярками, так в разных страницах в одном месте было два пробела, в другом - пробел и \xa0, я чуть не ебанулся - выглядит так же, а регулярка не отрабатывает.

                    Кое-где регекспы даже лучше, например, нарисуй мне замену "(<br>)+" на "<br><br>" с xpath.
                    Ответить
                    • > замену
                      > xpath
                      XPath это всего лишь селектор, сам по себе он ниче менять не умеет... Так что на этой задаче сравнивать его с регулярками не совсем честно.

                      Будет длинноватый код - заселектить xpath'ом нужные ноды и для каждой добавить в ее родителя еще одну ноду с <br>. Ничего сложного, но писанины больше, чем той регуляркой, это факт.
                      Ответить
                      • xpath может искать, как и регеспы.

                        >Ничего сложного, но писанины больше, чем той регуляркой, это факт.
                        Код в студию. С регекспами задача решается в лоб без раздумий.
                        Ответить
                        • > xpath может искать, как и регеспы.
                          Искать может. Заменять - только внешними средствами, например правкой нод через DOM. Есть еще XSLT, вот там эта задача тоже решается влоб, но писанины очень много (впрочем, в XSLT ее всегда много):
                          <!-- собственно замена -->
                          <xsl:template match="br">
                            <br/>
                            <br/>
                          </xsl:template>
                          
                          <!-- стандартный шаблон для копирования остальных нод без изменений -->
                          <xsl:template match="@* | node()">
                            <xsl:copy>
                              <xsl:apply-templates select="@* | node()"/>
                            </xsl:copy>
                          </xsl:template>
                          > Код в студию.
                          До эклипса доберусь - напишу.
                          Ответить
                        • > Код в студию.
                          NodeList nodes = (NodeList)xpath.evaluate("//br", doc, XPathConstants.NODESET);
                          // NodeList не реализует итератор, ну и хер с ним
                          for (int i=0; i<nodes.getLength(); i++) {
                              // нода с <br> и ее родитель
                              Node node = nodes.item(i);
                              Node parent = node.getParentNode();
                              // создаем новый элемент
                              Element br = doc.createElement("br");
                              // и вставляем его после node (какого-то хуя нет insertAfter)
                              parent.insertBefore(br, node.getNextSibling());
                          }
                          > в лоб без раздумий
                          Писал влоб, без раздумий, может быть можно и лучше, но маловероятно ;) Один раз заглянул в ман в поисках insertAfter, которого там не оказалось, зато нашелся insertBefore.
                          Ответить
                          • Сорри, неправильно прочитал задачу, не заметил там плюса. С плюсом полная жопа, да. Даже влом писать код, который будет выбирать подряд идущие br'ы в дереве. Имхо тут уже xpath ничем не поможет, придется рекурсивно сканить дерево да искать эти br'ы.
                            Ответить
              • Ну да, эквивалентны. Но ведь использовать готовое не комильфо!
                Ответить
    • мне кажется, или от просто первый знак проверит?
      Ответить
    • Ruby
      class String
        def isNumber?()
           self =~ /^(-?\d+(\.\d+)?)$/
           Regexp.last_match[1] if Regexp.last_match
        end
      end
      Ответить
      • туплю

        class String
          def isNumber?()
             self =~ /^(-?\d+(\.\d+)?$/
             Regexp.last_match
          end
        end
        
        puts "122.34".isNumber  # "122.34"
        puts "-122.34".isNumber # "-122.34"
        puts "122.34a".isNumber # nil
        Ответить
      • > isNumber?
        мне кажется, правильней было бы назвать number? знак вопроса уже заменяет is. Ну и studlyCaps в руби вроде бы не используется. В классах CamelCase, в методах - gnu_style(), как в питоне.
        Ответить
        • ну так я же шарпей - привык is писать у предикатов. и studlyCaps от туда же
          Ответить
        • >как в питоне.
          Как в си?

          Кстати, в XBMC сишное апи почему-то в жава стиле.
          Ответить
    • //fixed
      function CheckNumField(value) {
          return !isNaN(value);
      }
      Ответить
      • Выдержка из консоли вебкита
        > function CheckNumField(value) {
            return !isNaN(value);
        }
        undefined
        > CheckNumField('Infinity')
        true
        Ответить
        • До кучи добавить isFinite.
          Ответить
          • Однако, тонко. (именно такие комментарии плюсуют только, если автор - олдфаг)
            Ответить
            • > Однако, тонко.
              Хм, а что тут тонкого? Это, скорее, копетанство ;)
              Ответить
              • Это скорее троллинг, поскольку во-первых, где-то выше Вы писали о недостатках подобных функций, а во-вторых:
                популярная здесь выдержка из консоли вебкита:
                > function f(x){ return [!isNaN(x), isFinite(x)]; }
                undefined
                > f('1   ')
                [true, true]
                > f('')
                [true, true]
                > f('2')
                [true, true]
                > f('xxx')
                [false, false]

                '1 ', '' явно не все готовы видеть в качестве строкового представления чисел :)
                Ответить
                • Не, там я писал про parseFloat, который совсем уж корявый. Там не только безобидное '1 ' пролезает, но и '42хуйпиздаджигурда'.

                  > '1 ', '' явно не все готовы видеть в качестве строкового представления чисел :
                  Кстати, а жс умеет с ним оперировать?
                  Ответить
                  • Умеет, пока пробельные символы по краям:
                    > +' \t 1\n \t' === 1
                    true
                    > +'' === 0
                    true
                    > +'42хуйпиздаджигурда'
                    NaN
                    Ответить
    • показать все, что скрытоИщу партнёра для секса. Есть своя квартира. Анал, орал, группа. Пиши мне на [email protected]
      Ответить
      • припиши только что ты очень страшный парень и живешь в залуповке
        Ответить
        • Придется таки накодить мониторинг стока. Иначе из-за таких вот личностей, как этот guest, сток вайпается, и я перестаю видеть, что я читал, а что нет :( И меня это расстраивает.
          Ответить
          • и тогда я становлюсь грууустным пандой
            Ответить
        • Ты что повелся?
          Ответить
          • Конечно, а разве ты не хочешь дикой оргии с мальчиками?
            Ответить
            • Ага тоже звонил, но толстуха со страпоном лучше.
              Ответить
              • приезжай, солнце мое
                Ответить
                • Соблазнительно, но на какие извращения ты готов пойти.
                  Ответить
                  • Давай узнаем это вместе в лунном свете
                    Ответить
                    • OK. Не умри только.
                      Ответить
                      • Два голубка вызывают друг из друга native API, а окружающие им рукоплещут. Похвально, похвально...
                        Ответить
                        • > рукоплещут
                          Проявляют толерантность ;)
                          Ответить
                          • Ага, местные толерасты прогнали LucidFox и оставили ГК без зачетного пиздежа про лезбо-феминистскую революцию.
                            Ответить
                            • Попробуй обратиться в лигу секс-меньшинств, быть может, там тебе помогут...
                              Ответить
                              • Тебе вижу это помогло.
                                Ответить
                                • Толсто.
                                  Ответить
                                  • Не помогло?
                                    Ответить
                                    • Толсто, толсто...
                                      Ответить
                                      • А ты сама тонкота со своими гейдемонами))
                                        Ответить
                                        • Ты прав. Интересный сайт.
                                          ❤❤❤
                                          Ответить
                                          • http://cs7009.vk.me/c540105/v540105274/8b11/9-Nj4hgr6kI.jpg
                                            Ответить
                                            • ...Если молитвы не помогают, значит вы живете нелицензионную версию жизни.
                                              Ответить
                                              • Какие еще молитвы. Ты не понял. Даже Goatse угодно богу.
                                                А вот комментарии
                                                http://cs7009.vk.me/c540105/v540105274/8b19/zQGZb2G-F50.jpg
                                                Ответить
                                                • Не выдумывай.
                                                  Ответить
                                                  • Толсто
                                                    ru-antireligion.livejournal.com/10825973.html
                                                    Сразу тебе на это ссылку не давал. А то начал бы еще свою казырную речь про говноблоги.
                                                    Ответить
                                                    • Хуйня полнейшая. Тебе не стыдно такое постить? Если бы не ты, я бы такой бред и читать не стал, сразу листнул.
                                                      Ответить
                        • Ты просто завидуешь, что из тебя никто native API не вызывает.
                          Ответить
                          • Ага, обзавидовался весь.

                            http://content.gaydemon.com/pictures/7/a/71af760083d39633bc0af3ab4f43f9da.jpg
                            Ответить
                            • Что-то страшно переходить по таким ссылкам.
                              Ответить
                              • Никто и не заставляет.
                                Или я ошибаюсь?

                                ;O
                                Ответить
                                • У меня по ним ФСБ и АНБ переходят.
                                  Ответить
                                  • А-а-а! Теперь мне ясно, почему кое-кто так часто постит гоатсе. Ты решил обратить их в свою веру.
                                    :D
                                    Ответить

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