ASP中的数字溢出

时间:2014-06-11 10:16:30

标签: vbscript asp-classic numeric

我正在重新访问旧的经典ASP应用程序以添加一些新的必需品,其中一个需要根据某些standard rule for bank files执行aritmethic操作来生成id:

  • 根据某些规则从长字符串生成数字
  • 获取将此长号除以97
  • 的mod
  • 将此结果细分为98
  • 如果结果只有一位
  • ,则预先加上0

我在第一次操作时获得的数字是1185626240142800(超过最大长度的数量),我可以转换为Double但我无法获得mod 97

此规则是银行文件的标准,因此没有解决方法,我需要执行这些操作。

在我的Windows 7 64位中,我看到我可以在SQL Server中执行此操作,所以作为一个糟糕的黑客,它不是一个坏主意,任何其他想法?

顺便说一句,这个应用程序将运行在32位Windows服务器上,以防您认为这将是一个额外的问题

1 个答案:

答案 0 :(得分:1)

大于2,147,483,647的数字不适合Long数据类型。您可以实施algorithm described in this article

  

伪码:

     

找到nBig%a:

     

设d =一次可处理的位数。

     

重复v​​al(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