1. Ruby / Говнокод #8198

    −94

    1. 1
    2. 2
    3. 3
    4. 4
    5. 5
    6. 6
    7. 7
    def format_price price, delimeter = ' '
      s, i = price.to_s.reverse, 0
      Array.new(s.size) do |n|
        c = n.zero? ? '' : ((i += 1) % 3).zero? ? delimeter.to_s : ''
        c + s[n, 1]
      end.join.reverse
    end

    10000 -> "10 000"
    Как такое вообще принято делать между ровными пацанами?

    Запостил: LeshaXakir, 14 Октября 2011

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

    • Имхо все норм.
      Ответить
      • Сразу видно проффесионала, умеющего решать два стека.
        Ответить
        • показать все, что скрыто
          def two_stacks(n):
              s = str(n)
              return " ".join([s[max(i-3,0):i] for i in xrange(len(s),0,-3)][::-1])
          Ответить
          • Нет здесь O(1). Ты даже не знаешь что такое стек и какие с ним можно операции делать. Больше не появляйся на нашем ресурсе мудак.
            Ответить
          • Непонятно ровно одно.
            >def two_stacks
            Где здесь 2 стека, alexoy?
            Ответить
        • Я не разбираюсь в Ruby.
          Ответить
          • А никто и не разбрасывается
            Ответить
          • Не нужно разбираться в Ruby, чтобы понять, как это делается правильно.
            Ответить
          • а плохо. попробуй - должно понравиться, это достаточно красивый язык
            Ответить
            • НЕТ!

              когда я смотрю на Руби, у меня разрыв шаблона.
              а когда смотрю на Java, глаз радуется.
              Ответить
              • почему разрыв шаблона?
                Ответить
                • Размер программы и скорость разработки, может быть? Ну или код класса может содержать меньше 100 строк, а hello world вообще не содержит ни одного обьявления классов. для программистов с java головного мозга это разрыв шаблона
                  Ответить
                  • после перла мне ничего уже не страшно. ну разве что питон табами напугал
                    Ответить
    • Перловый вариант:
      sub commify {
              local $_  = shift;
              1 while s/^(-?\d+)(\d{3})/$1,$2/;
              return $_;
      }

      из http://www.perlmonks.org/?node_id=653

      думаю что на руби должно подобно регулярками делатся.

      ЗЫ еще на ту же тему: http://www.perlmonks.org/?node_id=110137
      Ответить
      • А ведь да, регулярки же!

        def format_price price, delimeter = ' '
          s = price.to_s
          s[$1] = delimeter + $1 if s =~ /\d(\d{3})($|\s)/ or break while true
          s
        end
        
        p format_price(12345678) # -> "12 345 678"


        Так лучше будет, пожалуй.
        Ответить
        • Уходит в бесконечный цикл если передать 100100. Нужно так
          def format_price price, delimeter = ' '
            s = price.to_s
            s[/#{$1}($|\s)/] = delimeter + $1 if s =~ /\d(\d{3})($|\s)/ or break while true
            s
          end
          Ответить
      • А что, указать thousand separator в функции форматирования числа вообще никак нельзя? o_O
        Ответить
        • можно. я просто цитировал оригинал.
          sub commify {
                  local $_  = shift;
                  my $delim = shift || ',';
                  1 while s/^(-?\d+)(\d{3})/$1$delim$2/;
                  return $_;
          }
          Ответить
    • у нормальных мужиков® в локали есть тысячный разделитель, если че
      Ответить
    • Если это рельсы, то все уже готово http://apidock.com/rails/ActionView/Helpers/NumberHelper/number_with_delimiter
      Ответить
    • "1234567890".reverse.gsub(/[0-9]{3}/){ |s| s + " " }.reverse
      # "1 234 567 890"
      Ответить

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