在DT中四舍五入货币格式的数字

epo3

我正在尝试以货币格式获取数字,然后将它们四舍五入,但是我从DT(v 0.1)中得到了意外的行为

我想要的值看起来像808084.227872401£808,084.2

这是代码:

library(DT)

m <- structure(list(A = c(808084.227872401, 1968554.9592654, 751271.053745238, 
-248530.769710688, 1022891.09543523, -407303.626363765), B = c(143073.342325492, 
-1440469.87343229, -590080.736184761, -608299.78907882, 1167155.65688074, 
803870.898483576), C = c(-447086.9382469, 606572.488852836, 89371.3745637198, 
-1496047.6143101, -410103.544644035, 1106358.3287006), D = c(0.754009573487565, 
0.364774209912866, 0.525769896339625, 0.44853704655543, 0.909551323624328, 
0.439131782157347), E = c(98.8604132297185, 98.9055931760521, 
99.3795062166865, 98.5895350315005, 101.194549174315, 102.325111315431
)), .Names = c("A", "B", "C", "D", "E"), row.names = c(NA, -6L
), class = "data.frame")

根据文档,这应该起作用:

datatable(m) %>% formatCurrency("A", "£", digits = 1)

但我收到以下错误:

formatCurrency(。,“ A”,“£”,数字= 1)中的错误:未使用的参数(数字= 1)

然后我尝试了另一个命令:

datatable(m) %>% formatCurrency("A", "£") %>% formatRound("A", 1)

但是它只格式化了货币而没有四舍五入。

在此处输入图片说明

有任何想法吗?

PS。我知道这个答案,但是我不想显示字符串,因为当显示为时,我想对数字进行排序datatable

伦茨奇格

我的结论是,您不能在的同一列中添加2个格式化程序DT,尽管我当然可能错了。

请注意,即使在的文档中未明确说明,DT每个列表也只能添加一个格式化程序。还要注意,在您提供的链接中的示例上,或者当您键入时?formatCurrency,当它们包括两个管道时%>%,它们总是会影响到两个不同的列。

在您的示例中,当您执行

datatable(m) %>% formatRound("A", digits=1) %>% formatCurrency("A", currency="£")

结果将舍入为1位无货币的数字,如果这样做

datatable(m) %>% formatCurrency("A", currency="£") %>% formatRound("A", digits=1)

结果是添加的货币没有四舍五入。

我对R如何与js集成的知识非常有限,但查看cran中软件包的R源,看起来管道中的每个format命令都附加了一个formatter,但由于某种原因,只有一个formatter起作用:

formatCurrency = function(table, columns, currency = '$', interval = 3, mark = ',') {
  formatColumns(table, columns, tplCurrency, currency, interval, mark)
}

formatRound = function(table, columns, digits = 2) {
  formatColumns(table, columns, tplRound, digits)
}

formatColumns = function(table, columns, template, ...) {
  ...
  x$options$rowCallback = appendFormatter(
    x$options$rowCallback, columns, colnames, rownames, template, ...
  )
  ...
}

appendFormatter = function(js, name, names, rownames = TRUE, template, ...) {
  ...
  JS(append(
    js, after = 1,
    template(i, ...)
  ))
}

其中每个格式化程序最终都会调用formatColumns不同的template,并i解析该列的ID。如我所说,我不知道这是因为追加操作会覆盖格式化程序,还是因为它与执行有关。


编辑:对不起,我不小心按下了发布按钮并被插上了。我实际上实现了一个带更多参数的格式化程序。该解决方案有点令人费解,但它可行。这是既接受货币又接受数字的格式化程序:

tplRound2 = function(cols, currency, digits) {
  sprintf(
    "var d = parseFloat(data[%d]); $(this.api().cell(row, %s).node()).html(isNaN(d) ? '' : '%s' + d.toFixed(%d).toString());",
    cols, cols, currency, digits
  )
}

您需要将所有这些功能添加到会话中:

formatRound2 = function(table, columns, currency, digits = 2) {
  formatColumns2(table, columns, tplRound2, currency, digits)
}

formatColumns2 = function(table, columns, template, ...) {
  if (inherits(columns, 'formula')) columns = all.vars(columns)
  x = table$x
  colnames = base::attr(x, 'colnames', exact = TRUE)
  rownames = base::attr(x, 'rownames', exact = TRUE)
  x$options$rowCallback = appendFormatter2(
    x$options$rowCallback, columns, colnames, rownames, template, ...
  )
  table$x = x
  table
}

name2int = function(name, names) {
  if (is.numeric(name)) {
    return(if (all(name > 0)) name else seq_along(names)[name])
  }
  names = setNames(seq_along(names), names)
  unname(names[name])
}

appendFormatter2 = function(js, name, names, rownames = TRUE, template, ...) {
  js = if (length(js) == 0) c('function(row, data) {', '}') else {
    unlist(strsplit(as.character(js), '\n'))
  }
  i = name2int(name, names)
  if (is.character(name) || (is.numeric(name) && !rownames)) i = i - 1
  if (any(is.na(i))) stop(
    'You specified the columns: ', paste(name, collapse = ', '), ', ',
    'but the column names of the data are ', paste(names, collapse = ', ')
  )
  JS(append(
    js, after = 1,
    template(i, ...)
  ))
}

然后,您可以使用新的格式化程序运行以获得所需的结果:

datatable(m) %>% formatRound2("A", "£", digits=1)

(但是,这不会将,每三位数字相加,如果您确实需要,我可以将其添加到格式化程序中...)


注释后的EDIT2

这将是使用货币和数字位数以及','标记的格式化程序功能:

tplRound3 = function(cols, currency, digits, interval, mark) {
  sprintf(
    "var d = parseFloat(data[%d]); $(this.api().cell(row, %s).node()).html(isNaN(d) ? '' : '%s' + d.toFixed(%d).toString().replace(/\\B(?=(\\d{%d})+(?!\\d))/g, '%s'));",
    cols, cols, currency, digits, interval, mark
  )
}


formatRound3 = function(table, columns, currency, digits = 2, interval=3, mark=',') {
  formatColumns2(table, columns, tplRound3, currency, digits, interval, mark)
}

为了使用它,只需键入

datatable(m) %>% formatRound3("A", "£", digits=1)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

四舍五入显示c中的浮点数输出的格式化货币

来自分类Dev

四舍五入并格式化PHP中的货币

来自分类Dev

在Android中四舍五入数字

来自分类Dev

在列表中四舍五入数字

来自分类Dev

在PHP中四舍五入不同的数字

来自分类Dev

在python中四舍五入数字

来自分类Dev

Python中的四舍五入数字

来自分类Dev

Laravel Blade 中的四舍五入数字

来自分类Dev

将数字四舍五入

来自分类Dev

如何四舍五入数字?

来自分类Dev

使用 XSLT 格式数字函数将值四舍五入到小数点后 2 位货币金额

来自分类Dev

Infragistics网站货币编辑四舍五入问题

来自分类Dev

在C ++中四舍五入

来自分类Dev

在matlab中四舍五入

来自分类Dev

我需要帮助使用记事本 ++ 和 python 脚本插件在文本文件中对数字进行四舍五入以进行货币转换

来自分类Dev

字符串格式的数字以百万为单位,以四舍五入为单位

来自分类Dev

使用无法在Kotlin中使用的格式对数字进行四舍五入

来自分类Dev

以字符格式四舍五入一个非常小的数字

来自分类Dev

避免数字在使用格式时总是四舍五入

来自分类Dev

将数字四舍五入为所选数字

来自分类Dev

四舍五入避免在后续求和中四舍五入

来自分类Dev

四舍五入避免在后续求和中四舍五入

来自分类Dev

格式化小数而不四舍五入

来自分类Dev

以指定的精度四舍五入数字

来自分类Dev

如何仅在Python中将数字四舍五入?

来自分类Dev

PHP将指数四舍五入到数字

来自分类Dev

在浮点值之后四舍五入数字

来自分类Dev

如何四舍五入到特定数字

来自分类Dev

始终将数字四舍五入