我正在重新访问旧的经典ASP应用程序以添加一些新的必需品,其中一个需要根据某些standard rule for bank files执行aritmethic操作来生成id:
我在第一次操作时获得的数字是1185626240142800(超过最大长度的数量),我可以转换为Double但我无法获得mod 97
。
此规则是银行文件的标准,因此没有解决方法,我需要执行这些操作。
在我的Windows 7 64位中,我看到我可以在SQL Server中执行此操作,所以作为一个糟糕的黑客,它不是一个坏主意,任何其他想法?
顺便说一句,这个应用程序将运行在32位Windows服务器上,以防您认为这将是一个额外的问题答案 0 :(得分:1)
大于2,147,483,647
的数字不适合Long
数据类型。您可以实施algorithm described in this article:
伪码:
找到nBig%a:
设d =一次可处理的位数。
重复val(nBig)> = a
1. tmpStr:=来自nBig的LHS的d位数 2. nBig:= nBig的剩余部分
3. tmpNum:= toInteger(tmpStr)
4. tmpNum:= tmpNum%a
5. tmpStr:= toString(tmpNum)
6. nBig:= tmpStr + nBig选择d:
d应满足以下约束
最大号码Mod a<中的数字d< = max。 tmpNum中的数字 - 最大数量Mod a中的数字 (例如:如果a = 512(Mod范围0..511),tmpNum可以存储最多16位数,那么 3< d< = 16-3)
(例如:如果a = 100(Mod范围0..99),tmpNum可以存储最多16位数,那么 2< d< = 16-2)
VBScript / VBA代码:
Function LongMod(strDividend As String, numDivisor As Long) As Long
Dim d As Long
Dim strTemp As String
Dim numTemp As Long
d = 9 - Len(CStr(numDivisor - 1))
While CDbl(strDividend) >= numDivisor
strTemp = Left(strDividend, d)
numTemp = CLng(strTemp) Mod numDivisor
strDividend = CStr(numTemp) & Mid(strDividend, d + 1)
Wend
LongMod = CLng(strDividend)
End Function
LongMod("1185626240142800", 97) ' 21
LongMod("330542811101000000123456182900", 97) ' 38