數字類型三位逗號隔開


需求:算法實現將數字每三位用逗號隔開: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