2017-10-13 7 views
2

Contexte

En raison d'un bug in Renjin, la famille format des fonctions ne sont pas disponibles, mais sprintf œuvres.un numéro comme une chaîne délimitée par des virgules

code

est ici une fonction de remplacement qui convertit un nombre en une chaîne délimitée par des virgules:

commas <- function(n) { 
    s <- sprintf("%03.0f", n %% 1000) 
    n <- n %/% 1000 

    while(n > 0) { 
    s <- concat(sprintf("%03.0f", n %% 1000), ',', s) 
    n <- n %/% 1000 
    } 

    gsub('^0*', '', s) 
} 

Question

Alors que le code fait le travail, comment la mise en œuvre peut être accéléré en haut? C'est-à-dire, comment le code peut-il être écrit de manière à utiliser R vernaculaire (sans en utilisant format, formatC, prettyNum, et similaire) et sans rompre Renjin packages (c'est-à-dire sans dépendances)?

Répondre

0

Malheureusement, un certain nombre de paquets Renjin ne sont pas pleinement mises en œuvre, de manière jusqu'à ce qu'une solution soit en place, le code dans la question est un travail décent autour:

commas <- function(n) { 
    s <- sprintf("%03.0f", n %% 1000) 
    n <- n %/% 1000 

    while(n > 0) { 
    s <- concat(sprintf("%03.0f", n %% 1000), ',', s) 
    n <- n %/% 1000 
    } 

    gsub('^0*', '', s) 
} 
2

Il existe un doublure lisse que vous pouvez utiliser pour ajouter des milliers de virgules aux nombres entiers d'un nombre, sans les ajouter à la partie décimale. L'utilisation str_replace_all du package stringr, nous pouvons utiliser ceci:

num <- "1234567890.12345" 
str_replace_all(num, "[0-9](?=(?:[0-9]{3})+(?![0-9])(?=\\.))", "\\0,") 
[1] "1,234,567,890.12345" 

Demo

+0

'str_replace_all' est également cassé dans Renjin. Voir: http://packages.renjin.org/package/org.renjin.cran/stringr/1.2.0/build/18#test-str_replace-examples –

+0

@DaveJarvis Je ne suis pas familier avec 'stringr' étant cassé. Ma réponse de base est d'utiliser une regex. Si cela ne répond pas à vos attentes, vous pouvez essayer autre chose. –