2016-03-16 3 views
8

strtoi(x,base=36) eine base36-codierte Zeichenfolge in eine ganze Zahl konvertiert:Konvertieren eine ganze Zahl base36

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

Gibt es eine Funktion, die diese Operation invertiert, das heißt, da eine positive ganze Zahl ergibt die base36 äquivalent? Im Wesentlichen, ich suche für eine itostr() Funktion, so dass

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

(ich nicht andere beliebige Basis brauche als 36, aber ein base Argument zu haben, wäre schön.)

+0

auch https://github.com/statsmaths/baseN –

+0

Kein Duplikat, aber eine ähnliche Frage wird diskutiert [hier.] (Http://stackoverflow.com/questions/23123314/converting-ascii-number-to -Strings-in-r) – RHertel

Antwort

6

Ich glaube, wenn Sie das Paket BBmisc installieren, hat es die Itostr-Funktion verfügbar ist.

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

ich nicht kenne irgendwelche Implementierungen, aber der Algorithmus ist nicht so schwierig. Hier ist einer, der auf 32-Bit-Ganzzahlen mit Vorzeichen arbeitet.

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

könnten Sie verwenden die bit64 und Rmpfr Pakete, wenn Sie größere Zahlen unterstützen müssen.

+0

Schön. Ich war ein wenig verblüfft, dass es auf 'intToBase36 (1679615)' brach, aber andererseits ist 'is.integer (1679615)' '' FALSE', und ein wenig erzwingen mit 'intToBase36 (1679615L)' macht den Trick . –

4

Eine schnelle RCPP hacken of this erhalten Sie es auch:

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" 

Es muss auf jeden Fall ein bisschen mehr Code für den produktiven Einsatz, though.

Das BBmisc Paket, das in einer anderen Antwort referenziert wird, ist auch C-backed, also ist es wahrscheinlich eine gute, performante Wahl.

+0

#ty Joshua. Ich habe keine Ahnung, wie das passiert ist (und ich hätte es fangen sollen) – hrbrmstr

+0

Das sieht interessant aus, aber um ehrlich zu sein, es ist ein bisschen einschüchternd für mich als Nicht-Rcpp-Benutzer. (Ich nehme an, die kanonische Erwiderung ist, dass ich ein Rcpp-Benutzer werden sollte. Ich plädiere für Zeitmangel.) Außerdem erhalte ich kryptische Fehler, die mit meinem deutschen Standardgebietsschema verbunden sein können: "include/Rcpp/Date.h: 103 : Fehler: Feld "m_tm" hat unvollständigen Typ ". –