Рубин: Разделить, а затем удалить начальные / конечные пробелы на месте?

Вы можете добавить атрибут min или max в input type=date . Дата должна быть в формате ISO (yyyy-mm-dd). Это поддерживается во многих мобильных браузерах и текущих версиях Chrome, хотя пользователи могут вручную вводить недопустимую дату без использования datepicker.


Атрибуты min и max должны быть полной датой; нет способа указать «сегодня» или «+0». Для этого вам необходимо использовать JavaScript или серверный язык:

var today = new Date().toISOString().split('T')[0];
document.getElementsByName("somedate")[0].setAttribute('min', today);

http://jsfiddle.net/mblase75/kz7d2/

Реализация только сегодня, при разрешении прошлых или будущих дат, здесь не вариант. Однако если вы хотите, чтобы завтра вы были min датой (гаснет сегодня и все прошлые даты), см. этот вопрос , чтобы увеличить today на один день.

Как и во всех других случаях, связанных с формами HTML, вы всегда должны проверять полевую серверную сторону независимо от того, как вы ограничиваете ее на стороне клиента.

29
задан Ben 14 July 2013 в 16:45
поделиться

6 ответов

s = "one thing, two things, three things, four things"
s.split(",").map(&:strip)
# => ["one thing", "two things", "three things", "four things"]

В моей ОС Ubuntu 13.04 , используя Ruby 2.0.0p0

require 'benchmark'

s = "one thing, two things, three things, four things"
result = ""

Benchmark.bmbm do |b|
  b.report("strip/split: ") { 1_000_000.times {result = s.split(",").map(&:strip)} }
  b.report("regex: ") { 1_000_000.times {result = s.split(/\s*,\s*/)} }
end

Rehearsal -------------------------------------------------
strip/split:    6.260000   0.000000   6.260000 (  6.276583)
regex:          7.310000   0.000000   7.310000 (  7.320001)
--------------------------------------- total: 13.570000sec

                    user     system      total        real
strip/split:    6.350000   0.000000   6.350000 (  6.363127)
regex:          7.290000   0.000000   7.290000 (  7.302163)
71
ответ дан Arup Rakshit 14 July 2013 в 16:45
поделиться

Если я не ошибаюсь,

things.split(", ")

будет самым простым решением. Однако это работает только тогда, когда есть ровно один пробел. (Обратите внимание на пробел после запятой)

2
ответ дан meschi 14 July 2013 в 16:45
поделиться

Не бить мертвую лошадь, но вы можете ускорить это, сделав два изменения, которые теперь стали для меня второй натурой. Первый - использовать map! вместо map, чтобы избежать создания копии разделенного массива, а второй - избегать использования символа для синтаксиса proc (например, &:split, который добавляет дополнительную операцию, которую можно избежать с более подробным синтаксисом).

Ниже приведен контрольный показатель:

require 'benchmark'

s = "one thing, two things, three things, four things"
result = ""

Benchmark.bmbm do |b|
    b.report("strip/split (map/to_proc): ") { 1_000_000.times { result = s.split(",").map(&:strip) } }
    b.report("strip/split (map): ") { 1_000_000.times { result = s.split(",").map { |e| e.strip } } }
    b.report("strip/split (map!/to_proc): ") { 1_000_000.times { result = s.split(",").map!(&:strip) } }
    b.report("strip/split (map!): ") { 1_000_000.times { result = s.split(",").map! { |e| e.strip } } }
    b.report("regex: ") { 1_000_000.times { result = s.split(/\s*,\s*/) } }
end

Результаты:

                                   user     system      total        real
strip/split (map/to_proc):     5.230000   0.010000   5.240000 (  5.283079)
strip/split (map):             4.660000   0.010000   4.670000 (  4.716920)
strip/split (map!/to_proc):    4.440000   0.020000   4.460000 (  4.492943)
strip/split (map!):            4.320000   0.010000   4.330000 (  4.365386)
regex:                         7.190000   0.060000   7.250000 (  7.322932)

Не забудьте прочитать числа относительно друг друга, а не относительно показателей, представленных в других ответах.

3
ответ дан xentek 14 July 2013 в 16:45
поделиться

Это не подразумевается как ответ на первоначальный вопрос, но я хотел поделиться кодом тестов, чтобы позволить людям самим проверить два предложенных решения:

require 'benchmark'

s = "one thing, two things, three things, four things"
result = ""

Benchmark.bmbm do |b|
  b.report("strip/split: ") { 1_000_000.times {result = s.split(",").map(&:strip)} }
  b.report("regex: ") { 1_000_000.times {result = s.split(/\s*,\s*/)} }
end

В моей системе (Ruby 2.0.0p247 на OS X 10.8), которая выдает следующий результат:

Rehearsal -------------------------------------------------
strip/split:    2.140000   0.000000   2.140000 (  2.143905)
regex:          3.570000   0.010000   3.580000 (  3.572911)
---------------------------------------- total: 5.720000sec

                    user     system      total        real
strip/split:    2.150000   0.000000   2.150000 (  2.146948)
regex:          3.580000   0.010000   3.590000 (  3.590646)

Эти результаты, конечно, могут варьироваться в зависимости от версий ruby, аппаратного обеспечения и ОС.

2
ответ дан pjs 14 July 2013 в 16:45
поделиться

Как любитель скорости, я люблю тесты ... Но давайте посмотрим правде в глаза: если вы не выполняете эту операцию внутри миллиона циклов в вашем коде, различия в скорости, вероятно, не будут влиять на ваш код почти так же, как очевидные кодирующие конструкции.

По моему мнению, если производительность не имеет значения, у @arup есть лучшее, самое простое и ясное решение.

6
ответ дан Jon Kern 14 July 2013 в 16:45
поделиться

Используйте регулярное выражение для #split:

"one thing, two things, three things, four things".split /\s*,\s*/
# => ["one thing", "two things", "three things", "four things"]
7
ответ дан Koraktor 14 July 2013 в 16:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: