背景概述
金融类App不可避免的需要展示金额信息,如¥12345678元,但当金额数值较大时,将一整串的金额显示在用户面前显然不够友好,所以业内通用做法是每隔3位添加一逗号,即显示成¥12,45,678元,极大地提升了用户体验。
Swift 代码实现
/**
* 将字符串每隔数位用分割符隔开
*
* @param source 目标字符串
* @param gap 相隔位数,默认为3
* @param gap 分割符,默认为逗号
* @return 用指定分隔符每隔指定位数隔开的字符串
*
*/
func showInComma(source: String, gap: Int=3, seperator: Character=",") -> String {
var temp = source
/* 获取目标字符串的长度 */
let count = temp.count
/* 计算需要插入的【分割符】数 */
let sepNum = count / gap
/* 若计算得出的【分割符】数小于1,则无需插入 */
guard sepNum >= 1 else {
return temp
}
/* 插入【分割符】 */
for i in 1...sepNum {
/* 计算【分割符】插入的位置 */
let index = count - gap * i
/* 若计算得出的【分隔符】的位置等于0,则说明目标字符串的长度为【分割位】的整数倍,如将【123456】分割成【123,456】,此时如果再插入【分割符】,则会变成【,123,456】 */
guard index != 0 else {
break
}
/* 执行插入【分割符】 */
temp.insert(seperator, at: temp.index(temp.startIndex, offsetBy: index))
}
return temp
}
//测试调用
print(showInComma(source: "1234567")) //输出1,234,567
print(showInComma(source: "1234567", gap: 4, seperator: "#")) //输出123#4567
图示代码执行原理
算法复杂度分析
- 本案通过逗号每隔3位分隔字符串,换一个角度考虑,其实就是从字符串尾部每隔3位插入一个逗号,自然的,我们可以借鉴直接插入排序的思想。
- 代码分析可知,上述方法主要耗时点在于插入分割符时其他元素的移动,因此时间复杂度为0(n)。