需求:算法实现将数字每三位用逗号隔开: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());
}
心得体会:
写算法之前,一定要认真仔细观察规律,保证是合理的,能想得通的,而不是在半吊子的过程中试错试出来的自己都看不懂的代码。
虽然做对了,但是没有理解,遇到相似情况仍然不能解决。