首页 > 解决方案 > 在 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# 更可取,但我很擅长翻译。先感谢您!

标签: c#biginteger

解决方案


手动格式化它可能有点像这样:

(前缀为字符串,它是一个 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";
}

推荐阅读