数字类型三位逗号隔开


需求:算法实现将数字每三位用逗号隔开:1,213,123,456,789

算法一

观察规律得:

​ 将整数从右向左每一个数字字符编上序号,每数三位数,数字前面有一个逗号,规律是:当数字所在的序号刚好被3整除时,这个数字前面有逗号;

​ 翻译成编码思想:

我们将每个数字字符从右向左数的序号定义为Pos;

1、定义一个list 将数字按照规律处理后添加到该list :var list=new List ()

2、循环整数的每一个数字字符:for(int i=0;i<str.length;i++)

2、如果Pos%30,在list里面添加一个‘,’,考虑临界值最高位不显示逗号 : if(Pos%30 && Pos!=str.Length){list.add(',');}

3、list里面添加当前字符 list.add(数字字符)

4、每个数字字符从右向左数的序号Pos=字符串的长度-当前字符在字符串中的索引:Pos=str.Length-i;

所以代码为:

/// <summary>
///格式化数字格式为三位逗号隔开,小数点后不需要隔开
/// </summary>
/// <param name="numStr"></param>
/// <returns></returns>
public static string FormatNumberic(string numStr)
{
    double defdb = 0;
    var isNum=double.TryParse(numStr, out defdb);
    if (!isNum) return "";

    var parts = numStr.Split('.');
    string partFloat = "";
    if (parts.Length > 1) { partFloat = "."+ parts[1]; }

    string partInt = parts[0];
    List<char> cl = new List<char>();

    //循环整数的每一个字符
    for (int i = 0; i < partInt.Length; i++)
    {
        // pos 当前字符位于整个字符串从右向左从1开始的序号 
        var pos = partInt.Length-i;
        if (pos%3==0 && pos!= partInt.Length)
        {
            cl.Add(',');
        }
        cl.Add(partInt[i]);
    }
    return string.Join("", cl.ToArray()) + partFloat;
}

算法二

观察规律得:

将字符串reverse之后:0123456789 再根据字符索引 (i+1)%3==0 :012,345,678,9

再Reverse之后为9,876,543,210

所以代码如下:

 public static string FormatNumberComaByReverse( string numStr) {
     List<char> Lc = new List<char>();
     var charArray= numStr.ToCharArray();
     Array.Reverse(charArray);
     for (int i = 0; i < charArray.Length; i++)
     {
         Lc.Add(charArray[i]);
         if ((i+1) % 3 == 0 && i != charArray.Length-1)
         {
            Lc.Add(',');
         }
     }
     Lc.Reverse();
     return String.Join("", Lc.ToArray());
 }

心得体会:

写算法之前,一定要认真仔细观察规律,保证是合理的,能想得通的,而不是在半吊子的过程中试错试出来的自己都看不懂的代码。

虽然做对了,但是没有理解,遇到相似情况仍然不能解决。


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM