C# 要舍入文本的数字

C# 要舍入文本的数字,c#,C#,我正在使用以下函数将数字转换为文本: public static string NumberToText(long number) { StringBuilder wordNumber = new StringBuilder(); string[] powers = new string[] { "Thousand ", "Million ", "Billion " }; string[] tens = new string[] { "Twenty", "Thirty", "

我正在使用以下函数将数字转换为文本:

public static string NumberToText(long number)
{
   StringBuilder wordNumber = new StringBuilder();

   string[] powers = new string[] { "Thousand ", "Million ", "Billion " };
   string[] tens = new string[] { "Twenty", "Thirty", "Forty", "Fifty", "Sixty", "Seventy", "Eighty", "Ninety" };
   string[] ones = new string[] { "One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten", 
                               "Eleven", "Twelve", "Thirteen", "Fourteen", "Fifteen", "Sixteen", "Seventeen", "Eighteen", "Nineteen" };

   if (number == 0) { return "Zero"; }
   if (number < 0)
   {
       wordNumber.Append("Negative ");
       number = -number;
   }

   long[] groupedNumber = new long[] { 0, 0, 0, 0 };
   int groupIndex = 0;

   while (number > 0)
   {
       groupedNumber[groupIndex++] = number % 1000;
       number /= 1000;
   }

   for (int i = 3; i >= 0; i--)
   {
       long group = groupedNumber[i];

       if (group >= 100)
       {
           wordNumber.Append(ones[group / 100 - 1] + " Hundred ");
           group %= 100;

           if (group == 0 && i > 0)
               wordNumber.Append(powers[i - 1]);
       }

       if (group >= 20)
       {
           if ((group % 10) != 0)
               wordNumber.Append(tens[group / 10 - 2] + " " + ones[group % 10 - 1] + " ");
           else
               wordNumber.Append(tens[group / 10 - 2] + " ");
       }
       else if (group > 0)
           wordNumber.Append(ones[group - 1] + " ");

       if (group != 0 && i > 0)
           wordNumber.Append(powers[i - 1]);
   }

   return wordNumber.ToString().Trim();
}

我如何做到这一点?

也许是这样的

虽然如果你有“可打印字符OCD”,你可能会得到更小的

private static string[] suffixes = new[] { "", "K", "Mill", "Bill", "Trill", "Zill" };

public static string ToStuff(double number, int precision = 2)
{
    const double unit = 1000;
    var  i = 0;
    while (number > unit)
    {
        number /= unit;
        i++;
    }
    if(i >= 5) throw new Exception("No one can count this high");
    return Math.Round(number, precision, MidpointRounding.AwayFromZero) + suffixes[i];
}
免责声明:完全未经测试

更新

由于流行的需求,我用一个测试用例1测试了它,例如
2500000,0
,它输出
2Mill
。我想我可能会在这场计数比赛中有一份职业

更新2


由于更普遍的需求,一致认为我们不应该使用.Net默认舍入
ToEven
(银行家舍入),而应该使用
AwayFromZero
可能是这样的

虽然如果你有“可打印字符OCD”,你可能会得到更小的

private static string[] suffixes = new[] { "", "K", "Mill", "Bill", "Trill", "Zill" };

public static string ToStuff(double number, int precision = 2)
{
    const double unit = 1000;
    var  i = 0;
    while (number > unit)
    {
        number /= unit;
        i++;
    }
    if(i >= 5) throw new Exception("No one can count this high");
    return Math.Round(number, precision, MidpointRounding.AwayFromZero) + suffixes[i];
}
免责声明:完全未经测试

更新

由于流行的需求,我用一个测试用例1测试了它,例如
2500000,0
,它输出
2Mill
。我想我可能会在这场计数比赛中有一份职业

更新2

由于更普遍的需求,一致认为我们不应该使用.Net默认舍入
ToEven
(银行家舍入),而应该使用
AwayFromZero
尝试以下方法:

if (number>1000000)
   string = floor(number/1000000).ToString() + "m";
else if (number > 1000)
   string = floor(number/1000).ToString() + "k";
else
   string = number.ToString();
请尝试以下操作:

if (number>1000000)
   string = floor(number/1000000).ToString() + "m";
else if (number > 1000)
   string = floor(number/1000).ToString() + "k";
else
   string = number.ToString();

通过编程?试试看。如果你写了以上内容,这应该不会太难。如果你陷入困境,在这里问一个特定的问题。通过编程?试试看。如果你写了以上内容,这应该不会太难。如果你被卡住了,在这里问一个具体的问题。谢谢。你的解决方案有效。迈克尔的回答非常清晰,教了我一些新东西。谢谢。你的解决方案有效。迈克尔的回答非常清晰,教会了我一些新东西。