@@ -42,7 +42,7 @@ yq <- function(x, quiet = FALSE){
4242# ' @export
4343qy <- function (x , quiet = FALSE ){
4444 assert(is.character(x ), " 'x' must be a character vector" )
45- r <- vapply(x , parse_yq , integer(1 ), pattern = " ^[^0-9]*[1-4][^0-9]*\\ d{4}[^0-9]*$" , USE.NAMES = FALSE )
45+ r <- vapply(x , parse_qy , integer(1 ), pattern = " ^[^0-9]*[1-4][^0-9]*\\ d{4}[^0-9]*$" , USE.NAMES = FALSE )
4646
4747 if (! quiet ){
4848 failed <- sum(is.na(r )) - sum(is.na(x ))
@@ -129,6 +129,31 @@ parse_yq <- function(x, pattern){
129129
130130
131131
132+ parse_qy <- function (x , pattern ){
133+ if (! grepl(pattern , x )){
134+ return (NA_integer_ )
135+ }
136+
137+ extr <- function (string , pos , length ){
138+ if (identical(pos , - 1 ))
139+ NA_integer_
140+ else
141+ as.integer(substr(string , pos , pos + length ))
142+ }
143+
144+ pos_y <- regexpr(" \\ d{4}[^0-9]*$" , x )
145+ year <- extr(x , pos_y , 3 )
146+ x <- strtrim(x , pos_y - 1L )
147+
148+ pos_q <- regexpr(" [1-4]{1}[^0-9]*" , x )
149+ quarter <- extr(x , pos_q , 0 )
150+
151+ as.integer(year ) * 10L + as.integer(quarter )
152+ }
153+
154+
155+
156+
132157# ' @inheritParams parse_yq
133158# ' @return an `integer` scalar for as_date_ym
134159# ' @noRd
0 commit comments