In R, its often useful to convert a numeric vector to character (e.g. plot legends). When doing this its nice when the number of characters used for each number is the same, because things look nicer that way — they line up better. It also helps to have the decimal in the same place for all the numbers. The way to do it is `sprintf`.

But I hate `sprintf`. Probably because I’m an `R` brat (i.e. someone who grew up more with R than with C, and so doesn’t know about all kinds of computer science things that are useful for good scientific programming). Still, I hate dealing with `sprintf`, which is what you need to solve the problem in the post title. Here’s a function that’s more intuitive to me:

``````round.char <- function(x, digits = 0){
if(digits < 0) digits <- 0
rd <- round(digits)
nc <- max(nchar(trunc(x))) + rd + 1
fmt <- paste('%0', nc, '.', rd, 'f', sep = '')
sprintf(fmt, x)
}``````

This function uses `sprintf`, but I’ve wrapped it in more intuitive syntactic sugar so I never have to think about `sprintf` again when doing this task.

Here’s an example,

``````> set.seed(1)
> x <- c(rnorm(2), rnorm(2, sd = 1000))
> round.char(x, 2)
[1] "-000.63" "0000.18" "-835.63" "1595.28"
> nchar(round.char(x, 2))
[1] 7 7 7 7
> ``````

As always…I’d love to hear of better ways to do this.