c# 4.0 -从非常大的模块到c#
本文关键字:模块 非常 | 更新日期: 2023-09-27 17:50:15
我有一个问题,从有31个字符的int模数。它似乎在
上出错了Int64 convertedNumber = Int64.Parse(mergedNumber);
和Value was either too large or too small for an Int64. (Overflow Exception)
。如何修复它,使模不会出错?
class GeneratorRachunkow {
private static string numerRozliczeniowyBanku = "11111155"; // 8 chars
private static string identyfikatorNumeruRachunku = "7244"; // 4 chars
private static string stalaBanku = "562100"; // 6 chars
public static string generator(string pesel, string varKlientID) {
string peselSubstring = pesel.Substring(pesel.Length - 5); // 5 chars (from the end of the string);
string toAttach = varKlientID + peselSubstring;
string indywidualnyNumerRachunku = string.Format("{0}", toAttach.ToString().PadLeft(13, '0')); // merging pesel with klient id and adding 0 to the begining to match 13 chars
string mergedNumber = numerRozliczeniowyBanku + identyfikatorNumeruRachunku + indywidualnyNumerRachunku + stalaBanku; // merging everything -> 31 chars
Int64 convertedNumber = Int64.Parse(mergedNumber);
Int64 modulo = MathMod(convertedNumber, 97);
Int64 wynik = 98 - modulo;
string wynikString = string.Format("{0}", wynik.ToString().PadLeft(2, '0')); // must be 2 chars
indywidualnyNumerRachunku = wynikString + numerRozliczeniowyBanku + identyfikatorNumeruRachunku + indywidualnyNumerRachunku;
return indywidualnyNumerRachunku;
}
private static Int64 MathMod(Int64 a, Int64 b) {
return (Math.Abs(a * b) + a) % b;
}
}
Int64
的最大值为9223372036854775807
(打印时19个字符)。你可能会想要使用BigInteger
(在。net 4中引入):
public static string generator(string pesel, string varKlientID) {
// I have cut some code here to keep it short
BigInteger convertedNumber;
if (BigInteger.TryParse(mergedNumber , out convertedNumber))
{
BigInteger modulo = convertedNumber % 97;
// The rest of the method goes here...
}
else
{
// string could not be parsed to BigInteger; handle gracefully
}
}
private static BigInteger MathMod(BigInteger a, BigInteger b)
{
return (BigInteger.Abs(a * b) + a) % b;
}
MaxValue是9,223,372,036,854,775,807,即19个字符。所以你不能把它放进去。我建议在处理大数时看看这个问题
试试用这个函数代替"MathMod":
static int ModString(string x, int y)
{
if (x.Length == 0)
return 0;
string x2 = x.Substring(0,x.Length - 1); // first digits
int x3 = int.Parse(x.Substring(x.Length - 1)); // last digit
return (ModString(x2, y) * 10 + x3) % y;
}
(因为所有的数字都是正数,所以使用Math没有意义。
这样使用:
modulo = ModString(mergedNumber,97);
这应该适用于。net 1.1以后的所有版本,而不需要BigInteger
这里展示了您正在寻找的答案。它包含了计算巨数模数的各种方法。我使用了与这里描述的类似的方法来处理国际银行账号。
直接链接到有复制粘贴方法的人在这里