R 将整数转换为base36

R 将整数转换为base36,r,base36,R,Base36,strtoi(x,base=36)将base36编码的字符串转换为整数: strtoi("zzzz",base=36) [1] 1679615 是否有一个函数可以反转此操作,即给定一个正整数,则生成base36等效值?本质上,我正在寻找一个itostr()函数 itostr(1679615,base=36) [1] "zzzz" (我不需要36以外的任何基,但是有一个base参数就好了。)我不知道有任何实现,但算法没有那么难。这是一个对32位有符号整数有效的方法 intToBase36 &l

strtoi(x,base=36)
将base36编码的字符串转换为整数:

strtoi("zzzz",base=36)
[1] 1679615
是否有一个函数可以反转此操作,即给定一个正整数,则生成base36等效值?本质上,我正在寻找一个
itostr()
函数

itostr(1679615,base=36)
[1] "zzzz"

(我不需要36以外的任何基,但是有一个
base
参数就好了。)

我不知道有任何实现,但算法没有那么难。这是一个对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=""))
}

intToBase36我相信如果你安装了BBmisc软件包,它就有了itostr功能

library(BBmisc)
itostr(1679615,base=36)
[1] "zzzz"
一个快速的Rcpp黑客也会让你得到它:

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"
库(内联)
CXX函数(签名(x=”数字“),正文=”
无符号int val=as(x);
静态字符常量base36[]=“0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ”;
std::字符串结果;
结果:储备(14);
做{
结果=base36[val%36]+结果;
}而(val/=36);
返回包装(结果);
,plugin=“Rcpp”)->base36enc
base36enc(36)
## [1] "10"
base36enc(72)
## [1] "20"
base36enc(73)
## [1] "21"
不过,它确实需要更多的代码用于生产


另一个答案中引用的
BBmisc
包也是一个很好的性能选择。

也不是重复的,但类似的问题也在讨论中#ty Joshua。我不知道这是怎么发生的(我本应该抓住它的),这看起来很有趣,但说实话,作为一个非Rcpp用户,这对我来说有点吓人。(我假设规范的反驳是我应该成为一个Rcpp用户。我辩解说时间不够。)此外,我还得到了可能与我的德语默认语言环境有关的神秘错误:“include/Rcpp/Date.h:103:error:field–m_tm”™ 有不完整的类型“.Nice”。我有点吃惊,它在
intToBase36(1679615)
上坏了,但是,当然
是.integer(1679615)
FALSE
,使用
intToBase36(1679615L)
进行一点强制操作就可以了。