【问题标题】:Is there a way to convert 1.00M to 1,000,000?有没有办法将 1.00M 转换为 1,000,000?
【发布时间】:2020-08-26 16:19:32
【问题描述】:

我用谷歌搜索了很多,但根据我的查询,我找不到任何有用的功能。

我想要的是:

1.2K       ->  1,200
304.0M     ->  304,000,000
987.654B   ->  987,654,000,000

有什么方法可以将带有后缀(K - 千、M - 百万、B - 十亿)的数字转换为原始双精度数?我只找到了向另一个方向转换的解决方案。

【问题讨论】:

  • dplyr 标签重要吗...?
  • 这里有一些其他可能有用的例子:this & this

标签: r function


【解决方案1】:
string_vec <- c("1.2K", "304.0M", "987.654B", "1.78")

conv_df <- data.frame(
  symbol = c("", "K", "M", "B"),
  value = c(1, 1000, 1000000, 1000000000)
)

convert <- function(string_vec){
  
  data.frame(
    string_value = parse_number(string_vec),
    symbol = string_vec %>% str_sub(start = -1) %>% str_remove("[0-9]") 
  ) %>%
    left_join(conv_df, by = "symbol") %>%
    mutate(true_value = string_value * value) %>%
    pluck("true_value")
}

convert(string_vec)

【讨论】:

  • 由于您使用的是 tidyverse,您可以使用 readr::parse_number(string_vec) 获取 string_value
  • @Ben tnx 很高兴知道它允许我优雅地添加“无符号”
【解决方案2】:

某处可能已经存在某些东西,但我懒得检查...

suffs <- c(K=1e3, M=1e6, B=1e9)
conv <- function(x) {
    nc <- nchar(x)
    suff <- substr(x,nc,nc) ## select last char
    suffval <- suffs[suff]  ## find corresponding numeric value
    num <- as.numeric(substr(x,1,nc-1))  ## select all but last char
    num*suffval
}
conv(c("1.2K","304.0M","987.654B"))

这不会对坏后缀、没有后缀的数字等进行任何检查。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2017-03-25
    • 2021-09-01
    • 2021-05-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多