ЙажаСценарий / Говнокод #13790 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 webelancer, (Updated )

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

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

    Только что-то тут лишнее: или return, или последующий 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 не надо.
                  Ответить
          • Ну 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 раз, пока не распарсишь им свою первую хтмлку. Дальше - на порядки легче 🙂

                        Ну а так - не спорю, для одноразового парсинга регулярки вполне сойдут.
                        Ответить
                • >Зачем это делают в век 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 от туда же
        Ответить
    • Выдержка из консоли вебкита
      > function CheckNumField(value) {
          return !isNaN(value);
      }
      undefined
      > CheckNumField('Infinity')
      true
      Ответить
        • Однако, тонко. (именно такие комментарии плюсуют только, если автор - олдфаг)
          Ответить
          • > Однако, тонко.
            Хм, а что тут тонкого? Это, скорее, копетанство 😉
            Ответить
            • Это скорее троллинг, поскольку во-первых, где-то выше Вы писали о недостатках подобных функций, а во-вторых:
              популярная здесь выдержка из консоли вебкита:
              > 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
                  Ответить

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

Я, guest, находясь в здравом уме и твердой памяти, торжественно заявляю:

    А не использовать ли нам bbcode?


    8