【问题标题】:Represent numeric value with typical dollar amount format用典型的美元金额格式表示数值
【发布时间】:2014-02-27 13:59:54
【问题描述】:

我有一个存储美元金额的数据框,看起来像这样

> a
  cost
1 1e+05
2 2e+05

我希望它可以显示为这样

> a  
  cost
1 $100,000
2 $200,000

如何在 R 中做到这一点?

【问题讨论】:

  • 到目前为止你尝试过什么?
  • 创建一个类和一个print 方法。

标签: r


【解决方案1】:
DF <- data.frame(cost=c(1e4, 2e5))

#assign a class    
class(DF$cost) <- c("money", class(DF$cost))

#S3 print method for the class    
print.money <- function(x, ...) {
  print.default(paste0("$", formatC(as.numeric(x), format="f", digits=2, big.mark=",")))
}

#format method, which is necessary for formating in a data.frame   
format.money  <- function(x, ...) {
  paste0("$", formatC(as.numeric(x), format="f", digits=2, big.mark=","))
}

DF
#         cost
#1  $10,000.00
#2 $200,000.00

【讨论】:

    【解决方案2】:

    这将为您提供除逗号之外的所有内容:

    > sprintf("$%.2f", seq(100,100000,by=10000)/7)
     [1] "$14.29"    "$1442.86"  "$2871.43"  "$4300.00"  "$5728.57"  "$7157.14"  "$8585.71"  "$10014.29" "$11442.86" "$12871.43"
    

    得到这些是相当复杂的,如这些问题所示:

    幸运的是,这是在scales package 中实现的:

    library('scales')
    > dollar_format()(c(100, 0.23, 1.456565, 2e3))
    ## [1] "$100.00"   "$0.23"     "$1.46"     "$2,000.00"
    > dollar_format()(c(1:10 * 10))
    ## [1] "$10"  "$20"  "$30"  "$40"  "$50"  "$60"  "$70"  "$80"  "$90"  "$100"
    > dollar(c(100, 0.23, 1.456565, 2e3))
    ## [1] "$100.00"   "$0.23"     "$1.46"     "$2,000.00"
    > dollar(c(1:10 * 10))
    ## [1] "$10"  "$20"  "$30"  "$40"  "$50"  "$60"  "$70"  "$80"  "$90"  "$100"
    > dollar(10^(1:8))
    ## [1] "$10"          "$100"         "$1,000"       "$10,000"      "$100,000"     "$1,000,000"   "$10,000,000"  "$100,000,000"
    

    【讨论】:

      【解决方案3】:

      您可以使用formattable 包中的currency() 函数。以OP为例

      a <- data.frame(cost = c(1e+05, 2e+05))
      a
      
         cost
      1 1e+05
      2 2e+05
      
      library(formattable)
      a$cost <- currency(a$cost, digits = 0L)
      a
      
            cost
      1 $100,000
      2 $200,000
      

      默认情况下,显示小数点后 2 位。已使用 digits 参数否决了这一点,以满足 OP 的期望。

      formattable 的好处是即使附加格式,数字仍然是数字,例如,

      a$cost2 <- 2 * a$cost
      a
      
            cost    cost2
      1 $100,000 $200,000
      2 $200,000 $400,000
      

      【讨论】:

        【解决方案4】:

        一个很简单的方法是

        library(priceR)
        values <- c(1e5, 2e5)
        format_dollars(values)
        
        # [1] "$100,000" "$200,000"
        

        注意事项

        • format_dollars(values, 2) 添加小数位,即 "$100,000.00" "$200,000.00"
        • 对于其他货币,请使用 format_currency(values, "€"),它提供 "€100,000" "€200,000"

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-03-12
          • 1970-01-01
          • 1970-01-01
          • 2020-01-25
          • 1970-01-01
          • 2020-10-09
          • 2020-10-09
          相关资源
          最近更新 更多