6

I would like to know how can I work with money with R. It means, do arithmetic, print well formatted numbers and etc.

For example I have some values

1.222.333,37 
1.223.444,88

I could translate it to numeric and round it, removing the cents, but there isn't a better pattern to work with? I did try the format method, something like:

format(141103177058,digits=3,small.interval=3,decimal.mark='.',small.mark=',')

but without success. any tip or ideas?

VP.
  • 5,004
  • 6
  • 42
  • 69
  • 3
    Formatting of output should always be left until output, you can always write your own function to print in the way you want, but what is your question? – Sean Dec 25 '12 at 09:09
  • 1
    What exactly do you mean by "work with money"? – A5C1D2H2I1M1N2O1R2T1 Dec 25 '12 at 09:09
  • i did update my question – VP. Dec 25 '12 at 09:19
  • 1
    See also this question: http://stackoverflow.com/q/7147706/269476 – James Dec 25 '12 at 10:44
  • thanks @James for output it is great, but i would like as well to handle the numbers keeping the cents, run apply over the vectors, etc – VP. Dec 25 '12 at 11:38
  • Floating-point is not a good representation for currency, for which you usually want accurate values to the cent (or better). `0.01` cannot be exactly represented in base-2 floating point. Fixed-point representation is usually used instead. – Matthew Lundberg Dec 25 '12 at 14:25

3 Answers3

8

The scales package has a function for this: dollar_format()

install.packages("scales")
library(scales)

muchoBucks <- 15558.5985121
dollar_format()(muchoBucks)

[1] "$15,558.60"
Dave Jarvis
  • 28,853
  • 37
  • 164
  • 291
4

Suppose we have two specific character values (currency):

s1 <- "1.222.333,37"
s2 <- "1.223.444,88"

First of all we want R to display numeric values with proper number of digits:

# controls representation of numeric values
options(digits=10)

Converting currency to numeric can be implemented like this:

# where s is character
moneyToDouble <- function(s){
  as.double(gsub("[,]", ".", gsub("[.]", "", s)))
}

x <- moneyToDouble(s1) + moneyToDouble(s2)
x    

Printing numeric as currency:

# where x is numeric
printMoney <- function(x){
  format(x, digits=10, nsmall=2, decimal.mark=",", big.mark=".")
}

printMoney(x)
Dominic Comtois
  • 9,595
  • 35
  • 53
redmode
  • 4,454
  • 1
  • 21
  • 30
4

What about this one:

printCurrency <- function(value, currency.sym="$", digits=2, sep=",", decimal=".") {
  paste(
        currency.sym,
        formatC(value, format = "f", big.mark = sep, digits=digits, decimal.mark=decimal),
        sep=""
  )
}

printCurrency(123123.334)
Sojoodi
  • 500
  • 4
  • 7