如何计算R中大数的校验位?

use*_*592 2 r division coercion

我必须添加一个2位数的检查(除以97的剩余部分)到52/200005/0001之类的数字(必须忽略斜杠).

我的代码如下,但由于数字太大而失败:

AppendCheckDigits <- function (x) {
  stopifnot(is.character(x) & length(x) == 1 & nchar(x) == 14)
  cd <- as.integer(paste(substring(x, 1, 2),
                         substring(x, 4, 9),
                         substring(x, 11, 14), sep="")) %% 97
  paste(x, "/", cd, sep="")
}
Run Code Online (Sandbox Code Playgroud)

用以下方法测试:

AppendCheckDigits("52/200005/0001")
Run Code Online (Sandbox Code Playgroud)

我该如何解决?

jub*_*uba 6

类的对象integer限制在2*10 ^ 9左右.您应该使用as.numeric而不是as.integer在您的函数中:

AppendCheckDigits <- function (x) {
  stopifnot(is.character(x) & length(x) == 1 & nchar(x) == 14)
  cd <- as.numeric(paste(substring(x, 1, 2),
                         substring(x, 4, 9),
                         substring(x, 11, 14), sep="")) %% 97
  paste(x, "/", cd, sep="")
}
Run Code Online (Sandbox Code Playgroud)

然后 :

> AppendCheckDigits("52/200005/0001")
[1] "52/200005/0001/43"
Run Code Online (Sandbox Code Playgroud)

请注意,您可以通过这种方式向量化和简化功能,例如:

AppendCheckDigits <- function (x) {
  stopifnot(is.character(x) & nchar(x) == rep(14,length(x)))
  num <- as.numeric(gsub("/","", x)) %% 97
  return(paste0(x, "/", num))
}
Run Code Online (Sandbox Code Playgroud)

然后 :

> AppendCheckDigits(c("52/200005/0001", "52/200005/0021"))
[1] "52/200005/0001/43" "52/200005/0021/63"
Run Code Online (Sandbox Code Playgroud)