2012-11-22 56 views
5

要检查一些银行帐号我想对帐号进行模97。 但很多帐号是在一个UInt64中输入大的。整数与24位数字

我该如何对24位整数进行操作?

感谢,

示例代码(它不能转换):

(Convert.ToUInt64("756842356987456214536254") % 97 == 1); 
+1

一个侧面说明:它可能是坏的想法将银行账号存储为数字......这不是一个真正的数学数字,它更像是汽车注册牌号。至少在世界某些地方,银行账户可能有字母,和/或中间可能有破折号和/或可移动的零(如11-22与000011-0000000022相同)。 – hyde

+3

我必须将它用作数字。因为IBAN标准检查银行账户的有效性。要做到这一点,我们必须改变帐号的字母,然后进行数学运算。观看:#http://en.wikipedia.org/wiki/International_Bank_Account_Number Validating_the_IBAN –

+0

啊,这是很好的琐事知道。 – hyde

回答

9

一种方法是使用System.NumericBigInteger

BigInteger bi = BigInteger.Parse("756842356987456214536254"); 
1

感谢,

这是工作。

Org.BouncyCastle.Math.BigInteger bi = new BigInteger("756842356987456214536254"); 

(Convert.ToInt32(bi.Mod(new BigInteger("97")).ToString()) == 1); 
+0

你没有看到它与BigInt? 它适合我。 我使用Org.BouncyCastle.Math.BigInteger –

+1

你不应该通过发布一个新的答案评论一篇文章。请在相关帖子上添加评论。答案不会按时间顺序显示,因此很清楚您回答的是哪个答案。 – Tormod

0

如果数字最多有28个数字,那么也可以使用decimal。这可能比BigInteger更方便使用。

+0

是的,但某些帐号的数字超过了28位。因此,我将使用BigInteger,因为它最多可以包含38位数字。 –

0

如果输入的文字可能是更容易采取串并使用Encoding.GetBytes method所以你得到的是可以传递给BigInteger constructor像这个例子中的字节数组:

var enc = new System.Text.UTF8Encoding(); 
var bi = new BigInteger(enc.GetBytes("756842356987456214536254")); 
var result = (bi % 97).ToString(); 
+0

这对我没有任何意义:BigInteger(byte [])'期待一个二进制表示的数字,而不是一个UTF-8字符数组! –