thousand separator

前言

   偶然看到一个简单的算法题,是一个千位分割的问题,就是比如输入12345678,输出12,345,678这种。听说这也是某个企业的面试题,闲来无事就着手实现一下。我先用了C++进行实现,后来换一种思路用了Python实现,最后采用了更为简单的正则表达式,并对负数、小数都加以实现。

C++实现

   由于笔者是个菜鸡,平时很少编程,C++还是大一的时候学了点皮毛,现在基本忘了差不多了🌚,所以用的很不熟练,下面是我实现千位分割问题的代码,如果有可以改进的地方,欢迎指出😉。

1


using namespace std;

int ()
{
    int num,len=0,extra,temp;
    int level=1;
    cout << "请输入一个数:";
    cin >> num;
    
    temp = num;
    while(temp>0)
    {
        temp /=10;
        len++;
        level *=10;
    }
    extra = len%3;   //超出3的倍数位的位数
    //输出带有千位分隔符的数字
    int k=0;
    while(len>0)
    {
        level /=10;
        cout << char(num/level+'0'); //输出每一位
        num %= level;
        k++;
        extra--;
        len--;
        if((extra == 0 && len > 2) || (k == 3 && len >0))
        {
            cout << ",";
            k = 0;
        }
    }
}

运行结果

9BD365C3762CE03BFBA0F6FE17F9F09F
20BFA4413E1BA985169A765EFE39

Python实现

   用C++实现这一简单的问题还是要费一点事的,所以我又转用Python进行了实现,这里我主要是把字符串转变为列表进行了处理。

1
2
3
4
5
6
7
8
9
10
11
num = input("请输入一个数:")
L =list(num) #转变为列表
num_length = len(num) #数字的位数
start = num_length%3 #超出3的倍数位的位数
index = list(range(start,num_length,3)) #需要插入","的索引值
step =0
for i in index:
if i >0:
L.insert(i+step,',')
step = step+1
print("".join(L)) #列表转字符串

运行结果


正则表达式实现

   读者可能已经发现了,我上述代码的实现对输入的数都要求是正数、整数,要实现正数负数,小数整数都能使用的话,还是需要添加部分代码的,于是这里使用正则表达式来进行实现。
   据说熟练掌握正则表达式可以节省上百行代码🤔,哈哈,由于这里的问题比较简单,不能充分体现出正则表达式的优势。而且Python的正则表达式引擎是用 C 语言写的,所以效率是十分高,并且几乎所有的字符串任务均可用正则表达式来实现,所以掌握正则表达式是十分有必要的,大家有时间可以去学习一波🤓。下面就贴出我的代码:

1
2
3
4
5
6
7
8
9
num = input("请输入一个数:")
m = re.search('.', num)
if m == None: #如果是整数
result = re.sub(r"(?<=d)(?=(d{3})+$)", ",", num)
else: #如果是小数
inte, dec = re.split('.', num) #整数、小数分开处理
inte = re.sub(r"(?<=d)(?=(d{3})+$)", ",", inte)
result = inte + '.' +dec #合并
print(result)

运行结果




   可以发现,该程序对负数、小数都能实现千分位分割。正则表达式好处自然很明显,劣势就是不易读,如果不是很熟悉的话很难快速理解该表达式的意思,这里 (?<=d) 的意思是匹配项前面要有数字,而 (?=(d{3})+$) 的意思是匹配项后面到结束符要有3的倍数个数字,需要注意的是这里的匹配不消耗字符串的内容,所以原本用作替换的sub函数相当于实现了插入的功能。

后记

   从上面不同方法的实现,可以看出正则表达式在处理字符串方面的优势,由此可见正则表达式是一个十分重要的技能。其实,像千位分割这种常见的操作,Python怎么会没有函数能够一步到位实现呢🤔?果然,查阅资料后发现,format函数就可以实现这一功能。

1
print(format(-123456789.12345,','))

这样就完事啦,是不是非常简单🌚,不过笔者在这里主要是为了强调正则表达式的优势哈哈哈😁,并且这种难读的表达式还需要多多操作啊。