如何让formatC函数支持int64大整数的千位分隔符格式化?
解决formatC处理int64大整数的问题
当使用formatC()处理超出32位整数范围的大整数时,format='d'参数会强制将输入转为32位integer类型,因数值超出范围导致溢出产生NA。以下是几种可行的解决方法:
方法1:转字符型后用正则添加千位分隔符
直接将大整数转为字符串,通过正则表达式插入千位分隔符:
x <- 2254728285 gsub("(?<=\\d)(?=(\\d{3})+$)", ",", as.character(x), perl = TRUE) # [1] "2,254,728,285"
方法2:用format()函数替代formatC()
format()默认将大整数视为numeric类型处理,不会强制转成32位整数,同时支持千位分隔:
x <- 2254728285 format(x, big.mark = ",", scientific = FALSE) # [1] "2,254,728,285"
方法3:处理integer64类型数据
如果大整数是integer64类型(比如从文件读取的int64数据),可借助bit64包转字符后处理:
library(bit64) x <- as.integer64("2254728285") gsub("(?<=\\d)(?=(\\d{3})+$)", ",", as.character(x), perl = TRUE) # [1] "2,254,728,285"
方法4:自定义函数兼容大小整数
封装一个自动判断整数范围的函数,统一处理大小整数的格式化:
format_big_int <- function(x, big.mark = ",") { if (x > .Machine$integer.max || x < -.Machine$integer.min) { gsub("(?<=\\d)(?=(\\d{3})+$)", big.mark, as.character(x), perl = TRUE) } else { formatC(x, big.mark = big.mark, format = "d") } } # 测试大整数 format_big_int(2254728285) # [1] "2,254,728,285" # 测试小整数 format_big_int(22547282) # [1] "22,547,282"
内容的提问来源于stack exchange,提问作者Gopala
相关产品推荐
相关产品推荐

