Соответствие нарезанной строке - PullRequest
0 голосов
/ 06 марта 2019

Я пытаюсь использовать оператор case:

week # => "03 – 09 MAR 2019"
first_day = week.slice(0..2) # => 03
last_day = week.slice(5..7) # => 09
month = week.slice(8..11) # => MAR
year = week.slice(12..17) # => 2019
puts month # >> MAR
case month
when 'JAN' then month_num = '01'
when 'FEB' then month_num = '02'
when 'MAR' then month_num = '03'
when 'APR' then month_num = '04'
when 'MAY' then month_num = '05'
when 'JUN' then month_num = '06'
when 'JUL' then month_num = '07'
when 'AGO' then month_num = '08'
when 'SEP' then month_num = '09'
when 'OCT' then month_num = '10'
when 'NOV' then month_num = '11'
when 'DEC' then month_num = '12'
else month_num = 'ERROR'
end
puts month_num # >> ERROR

Однако оператор case всегда переходит в ветвь else.

Почему переменная month_num равно строке "ERROR" вместо "03"?

Ответы [ 3 ]

3 голосов
/ 06 марта 2019

Вы используете puts, чтобы проверить, что у вас есть, и, следовательно, вам не хватает наблюдать пробелы в ваших результатах.На самом деле у вас есть:

week.slice(0..2) # => "03 "
week.slice(5..7) # => "09 "
week.slice(8..11) # => "MAR "
week.slice(12..17) # => "2019"

Чтобы наблюдать за тем, что у вас есть, лучше использовать p, а не puts.

У вас неправильный диапазон.На самом деле здесь нет причин использовать диапазоны.Намного проще использовать второй аргумент для указания длины:

week.slice(0, 2) # => "03"
week.slice(5, 2) # => "09"
week.slice(8, 3) # => "MAR"
week.slice(12, 4) # => "2019"
2 голосов
/ 06 марта 2019

Похоже, вы хотите проанализировать строку, содержащую данные в определенном формате.Вместо абсолютных индексов вы можете использовать регулярное выражение для соответствия формату даты, например:

PATTERN = /
  (?<first_day>\d{2}) # 2-digit first day
  \s*                 # optional whitespace
  [–-]                # delimiter(s)
  \s*
  (?<last_day>\d{2})  # 2-digit last day
  \s*
  (?<month>\w{3})     # 3-letter month name
  \s*
  (?<year>\d{4})      # 4-digit year
/ix

Для извлечения данных:

str = '03 – 09 MAR 2019'
m = str.match(PATTERN)
#=> #<MatchData "03 – 09 MAR 2019" first_day:"03" last_day:"09" month:"MAR" year:"2019">

m[:first_day] #=> "03"
m[:last_day]  #=> "09"
m[:month]     #=> "MAR"
m[:year]      #=> "2019"

Результаты могут быть дополнительно введены в Date.strptime:

require 'date'

from = m.values_at(:first_day, :month, :year).join(' ') #=> "03 MAR 2019"
to   = m.values_at(:first_day, :month, :year).join(' ') #=> "09 MAR 2019"

Date.strptime(from, '%d %b %Y')  #=> #<Date: 2019-03-03 ...>
Date.strptime(to, '%d %b %Y')    #=> #<Date: 2019-03-09 ...>

или _strptime, если вас просто интересуют необработанные значения:

Date._strptime(from, '%d %b %Y')
#=> {:mday=>3, :mon=>3, :year=>2019}
2 голосов
/ 06 марта 2019

Ваш month равен "MAR "

Попробуйте

month = week.slice(8..10)

И имеет смысл, от 8 до 10 включительно - три символа.То же самое для других частей.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...