Преобразование целого числа в base36
strtoi(x,base=36)
преобразует строку в кодировке base36 в целое число:
strtoi("zzzz",base=36)
[1] 1679615
есть ли функция, которая инвертирует эту операцию, т. е., учитывая положительное целое число, дает эквивалент base36? По сути, я ищу itostr()
функция такая, что
itostr(1679615,base=36)
[1] "zzzz"
(мне не нужна никакая база, кроме 36, но
3 ответов
Я считаю, если вы установите пакет BBmisc, он имеет функцию itostr доступен.
library(BBmisc)
itostr(1679615,base=36)
[1] "zzzz"
Я не знаю никаких реализаций, но алгоритм не так уж сложен. Вот тот, который работает на 32-разрядных целых чисел со знаком.
intToBase36 <- function(int) {
stopifnot(is.integer(int) || int < 0)
base36 <- c(as.character(0:9),LETTERS)
result <- character(6)
i <- 1L
while (int > 0) {
result[i] <- base36[int %% 36L + 1L]
i <- i + 1L
int <- int %/% 36L
}
return(paste(result, sep="", collapse=""))
}
можно использовать bit64 и Rmpfr пакеты для поддержки больших чисел.
быстрый Rcpp hack этой получите вы его также:
library(inline)
cxxfunction(signature(x="numeric"), body='
unsigned int val = as<unsigned int>(x);
static char const base36[] = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ";
std::string result;
result.reserve(14);
do {
result = base36[val % 36] + result;
} while (val /= 36);
return wrap(result);
', plugin="Rcpp") -> base36enc
base36enc(36)
## [1] "10"
base36enc(72)
## [1] "20"
base36enc(73)
## [1] "21"
ему определенно нужно немного больше кода для использования в производстве.
на BBmisc
пакет, на который ссылается другой ответ, также C-backed так что это, вероятно, хороший, эффективный выбор.