2016-03-16 5 views
8

strtoi(x,base=36) vous permet de convertir une chaîne codée base36 à un entier:Convertir un entier en base36

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

Y at-il une fonction qui intervertit cette opération, à savoir, étant donné un nombre entier positif donne l'équivalent base36? Essentiellement, je suis à la recherche d'une fonction itostr() telle que

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

(je ne nécessitent pas de base autre que 36, mais un argument base serait agréable d'avoir.)

+0

également https://github.com/statsmaths/baseN –

+0

Pas un doublon, mais une question similaire est discutée [ici.] (Http://stackoverflow.com/questions/23123314/converting-ascii-number-to -strings-in-r) – RHertel

Répondre

6

Je crois que si vous installez le paquet BBmisc, il a la fonction itostr est disponible.

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

Je ne connaître des implémentations, mais l'algorithme n'est pas si difficile. Voici un qui fonctionne sur les entiers signés 32 bits.

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="")) 
} 

Vous pouvez utiliser les bit64 et Rmpfr packages si vous avez besoin pour soutenir des entiers plus grands.

+0

Nice. J'ai été un peu déconcerté par le fait qu'il a cassé 'intToBase36 (1679615)', mais là encore, bien sûr 'is.integer (1679615)' est 'FALSE', et un peu de coercition en utilisant' intToBase36 (1679615L) 'fait l'affaire . –

4

Un hack CRPP rapide of this vous obtiendrez aussi bien:

library(inline) 

cxxfunction(signature(x="numeric"), body=' 
unsigned int val = as<unsigned int>(x); 
static char const base36[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; 
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" 

Il faut sans aucun doute un peu plus de code pour l'utilisation de la production, bien que.

Le package BBmisc référencé dans une autre réponse est également C-backed, c'est donc probablement un bon choix performant.

+0

#ty Joshua. Je n'ai aucune idée de comment cela est arrivé (et j'aurais dû l'attraper) – hrbrmstr

+0

Cela semble intéressant, mais pour être honnête, c'est un peu intimidant pour moi en tant qu'utilisateur non-Rcpp. (Je suppose que la réplique canonique est que je * devrais devenir un utilisateur de Rcpp.] Je me plains du manque de temps. De plus, j'obtiens des erreurs cryptées qui peuvent être connectées à mon locale par défaut allemand: "include/Rcpp/Date.h: 103 : error: le champ "m_tm" a un type incomplet ". –