2014-10-03 58 views
2

我必須在52/200005/0001(必須忽略斜線)的數字上添加一個2位數的支票(除97除外)。如何計算R中大數的校驗位?

我的代碼是下面的,但它失敗,因爲太多大數目:

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="") 
} 

測試它:

AppendCheckDigits("52/200005/0001") 

我怎樣才能解決呢?

回答

6

integer類的對象限制在2 * 10^9左右。

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="") 
} 

然後:

> AppendCheckDigits("52/200005/0001") 
[1] "52/200005/0001/43" 

請注意,您可以矢量化和簡化功能這種方式,例如:你應該在你的函數中使用as.numeric,而不是as.integer

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

然後:

> AppendCheckDigits(c("52/200005/0001", "52/200005/0021")) 
[1] "52/200005/0001/43" "52/200005/0021/63" 
+0

我還能說什麼比「我沒有期待這樣一個完美的答案,清晰而廣泛」?不知道! ;-) – user3341592 2014-10-03 15:12:08

+0

代碼AppendCheckDigits < - function(x){stoplexnot(is.character(x)&nchar(x)== 14) num < - as.numeric(gsub(「/」,「」,x ))%% 97 paste0(x,「/」,num)似乎和你一樣工作。這裏沒有「rep」,也沒有「return」。他們真的很重要嗎? } – user3341592 2014-10-03 15:28:28

+0

@ user3341592不,你說得對,使用回收規則時不需要在這裏使用'rep'。你的代碼很好,更乾淨。 – juba 2014-10-03 18:39:21

2

使用文件的路徑和底塗所有非數字@朱巴的回答的變化:

AppendCheckDigits <- function (x) { 
    stopifnot(is.character(x) & nchar(x) == rep(14,length(x))) 
    num <- as.numeric(gsub("\\D","", x)) %% 97 
    file.path(x, num) 
} 

AppendCheckDigits(c("52/200005/0001", "52/200005/0021")) 
## [1] "52/200005/0001/43" "52/200005/0021/63" 

更多不同的方式,這可能接洽如果將來的搜索者也有類似的問題,這可能會替代品。

+0

是的,你很高興在這裏提供替代品。這樣的迴應被讀取和閱讀,並證明是有用的! – user3341592 2014-10-03 15:38:22