Вот быстрая функция:
ft2m <- function(s) {
# add inches if missing or no-quotes; adding extraneous leading zeroes is okay
s1 <- gsub("'([0-9.]*)$", "'0\\1\"", s)
s2 <- gsub("^([0-9.]+)\"?$", "0'\\1\"", s1)
gre <- gregexpr("([0-9.]+)(?=')", s2, perl = TRUE)
feet <- as.numeric(regmatches(s2, gre))
gre <- gregexpr("(?<=')([0-9.]+)(?=\")", s2, perl = TRUE)
inch <- as.numeric(regmatches(s2, gre))
0.3048 * (feet + inch/12)
}
Демо:
vec <- c("5'10", "3'10\"", "0'9.3\"", "2'", "2'0", "2'0\"", "10\"")
ft2m(vec)
# [1] 1.77800 1.16840 0.23622 0.60960 0.60960 0.60960 0.25400
Объяснение:
Если вы debug(ft2m)
и посмотрите на значения каждого вектора поста - s2
, вы увидите, что gsub
s проверяет, что у нас есть хорошо отформатированные строки.
cbind(s, s1, s2)
# s s1 s2
# [1,] "5'10" "5'010\"" "5'010\""
# [2,] "3'10\"" "3'10\"" "3'10\""
# [3,] "0'9.3\"" "0'9.3\"" "0'9.3\""
# [4,] "2'" "2'0\"" "2'0\""
# [5,] "2'0" "2'00\"" "2'00\""
# [6,] "2'0\"" "2'0\"" "2'0\""
# [7,] "10\"" "10\"" "0'10\""
Я "ловлю" строки, которые являются только футами, только дюймами или дюймов без "
. Он не улавливает такие бессмысленные проблемы, как более 12 дюймов. Это также позволит использовать десятичные футы и дюймы (десятичные или иные), что, тем не менее, остается неясным, если мы определим это как «некоторое число, '
, другое число и "
».