c# - 在 C# 中减少 BigInteger 值
问题描述
我对使用 BigIntegers 有点陌生,并且已经尝试了一些东西来让这个系统正常工作,但现在感觉有点卡住了,我真的很感激朝着正确的方向或解决方案轻推。
我目前正在开发一个系统,将 BigInteger 值降低为更易读的形式,这在我当前的实现中运行良好,但我想进一步扩展它以实现小数。
为了更好地展示我正在尝试的内容,我将对其进行分解。
在这种情况下,我们有一个采用 BigInteger 并将其作为字符串返回的方法:
public static string ShortenBigInt (BigInteger moneyValue)
考虑到这一点,当将诸如10,000之类的数字传递给此方法时,将返回10k 。1,000,000相同,它将返回1M。
这是通过执行以下操作来完成的:
for(int i = 0; i < prefixes.Length; i++)
{
if(!(moneyValue >= BigInteger.Pow(10, 3*i)))
{
moneyValue = moneyValue / BigInteger.Pow(10, 3*(i-1));
return moneyValue + prefixes[i-1];
}
}
该系统通过从前缀数组中获取字符串并将数字缩减为最简单的形式并将两者组合并在该前缀范围内返回它来工作。
因此,在这种情况下,我的问题是:我该如何以同样的方式返回它,传递100,000将返回100k,但同时执行类似1,111,111的操作将返回1.11M?
目前,通过1,111,111M返回1M,但我希望附加.11标记。不超过 2 位小数。
我最初的想法是将大整数转换为字符串,然后将前几个字符分块成一个新字符串并在其中解析一个小数,但是由于前缀在值达到第 1000 个标记之前不会改变,所以很难判断何时放置小数位。
我的下一个想法是使用 BigInteger.Log 将值减少为十进制友好数字并进行简单的除法以获得十进制形式的值,但这样做似乎不适用于我的实现。
该系统应动态地适用于以下前缀:
k,M,B,T,qd,Qn,sx,Sp,O,N,de,Ud,DD,tdD,qdD,QnD,sxD,SpD,OcD,NvD,Vgn,UVg,DVg,TVg,qtV, QnV、SeV、SPG、OVG、NVG、TGN、UTG、DTG、tsTG、qtTG、QnTG、ssTG、SpTG、OcTG、NoTG、QdDR、uQDR、dQDR、tQDR、qdQDR、QnQDR、sxQDR、SpQDR、OQDDr、NQDDr、 qQGNT、uQGNT、dQGNT、tQGNT、qdQGNT、QnQGNT、sxQGNT、SpQGNT、OQQGNT、NQQGNT、SXGNTL
有人会碰巧知道如何做这样的事情吗?任何语言都可以,C# 更可取,但我很擅长翻译。先感谢您!
解决方案
手动格式化它可能有点像这样:
(前缀为字符串,它是一个 char[])
public static string ShortenBigInt(BigInteger moneyValue)
{
string prefixes = " kMGTP";
double m2 = (double)moneyValue;
for (int i = 1; i < prefixes.Length; i++)
{
var step = Math.Pow(10, 3 * i);
if (m2 / step < 1000)
{
return String.Format("{0:F2}", (m2/step)) + prefixes[i];
}
}
return "err";
}
推荐阅读
- javascript - 如何使用 javascript 和 gmail API 在给定时间点后检索消息?
- javascript - 如何在刷新其容器 div 后应用 jQuery databale?
- types - 是否有一个流程可以让我找出适合我的 Diesel 功能的正确类型?
- python - 从字符串生成固定长度的确定性标识符
- javascript - 使用 Node.js 从 MongoDb 获取用户
- google-compute-engine - google-compute-engine - 虚拟机和计费
- docker - Hyperledger Fabric:Orderer 客户端无法连接到 orderer.example.com
- r - 将半向量化转换为全矩阵的最聪明方法
- python-3.x - 在cmd中使用python3.5时的python脚本
- asp.net - 我的 .cshtml 页面打不开