最近在碰到一些數字超過 C# 的 Decimal 的極限了,後來我查一下,原來還有一個東西叫做 BigInteger
看起來可以解決我要的問題,所以順手作了一些筆記,想說就記錄一下..

這邊案例我有一個數字,123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890
夠長了吧,這鬼東西要怎麼念可以參考 這裡
,這邊就不贅述了
接下來就是程式碼的部分,這裡面有包含轉 HEX 全小寫,之後再將 HEX 轉回十進位
var str = "123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890";
BigInteger bInt1 = BigInteger.Parse(str);
//轉十六進位字串小寫,如果要大寫可以用 X
var hexString1 = bInt1.ToString("x");
Console.WriteLine("DEC => HEX:");
Console.WriteLine(hexString1);
//轉十六進位如果開頭是 0 則去掉,這是因為我案例需要如果是您平常使用你可以忽略那個0 ,因為這跟表正負數有關係
var hexString2 = bInt1.ToString("x").TrimStart('0');
Console.WriteLine("DEC => HEX(remove prefix 0):");
Console.WriteLine(hexString2);
//十六進位轉回10進位
var restoreBigInteger1 = BigInteger.Parse(bInt1.ToString("x"), System.Globalization.NumberStyles.AllowHexSpecifier);
Console.WriteLine("HEX => DEC");
Console.WriteLine(restoreBigInteger1);
//去0的十六進位轉10進位
Console.WriteLine("HEX => DEC(remove prefix 0):");
var restoreBigInteger2 = BigInteger.Parse(bInt1.ToString("x").TrimStart('0'), System.Globalization.NumberStyles.AllowHexSpecifier);
Console.WriteLine(restoreBigInteger2);
我都寫在程式碼註解了,中間有一個關鍵就是都會有一個 0 要去判斷正負,所以要不要移除這就是要看你了
Result:
DEC => HEX:
0d755e029f7a371304e2191353fa3b1acf71e3186c5b8bef42e4bc83809f9efbf6d75a3319b8a871190e81ec72
DEC => HEX(remove prefix 0):
d755e029f7a371304e2191353fa3b1acf71e3186c5b8bef42e4bc83809f9efbf6d75a3319b8a871190e81ec72
HEX => DEC
123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890123467890
HEX => DEC(remove prefix 0):
-23316021299896686619624647175865674087512269183302101795737795597295173946195137593013297275580153816028046