问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
测试样例1:
输入:`s = "1294512.12412"`
输出:`'1,294,512.12412'`
测试样例2:
输入:`s = "0000123456789.99"`
输出:`'123,456,789.99'`
测试样例3:
输入:`s = "987654321"`
输出:`'987,654,321'`
问题分析
本题的目标是将用户输入的数字字符串转换为带有千分位逗号的格式,并且保留小数部分。同时,需要移除数字字符串前多余的无用零。通过测试样例可以看到,我们需要处理以下几种情况:
- 整数部分添加千分位逗号:如
987654321转换为987,654,321。 - 保留小数部分:如
1294512.12412保留小数部分,结果为1,294,512.12412。 - 去掉多余的前导零:如
0000123456789.99转换为123,456,789.99。 - 支持仅有整数部分或小数部分的输入:比如
00000123或0.12345。
在本题中,可以将输入的数字字符串划分为两部分:整数部分 和 小数部分,分别进行处理:
-
移除前导零:输入的字符串可能包含无用的前导零,需要先去掉。例如,
0000123456789.99的前导零应被移除,处理后为123456789.99。 如果整数部分为0,如000.123,需要特殊处理。 -
分离整数和小数部分:使用
split('.')方法将字符串按小数点分隔为两部分。第一部分是整数部分,第二部分是小数部分(如果存在)。 -
为整数部分添加千分位逗号: 可以利用 Python 内置的字符串格式化方法,如
"{:,}",快速将数字转换为带千分位的格式。 -
拼接结果:处理好的整数部分和小数部分重新拼接。如果没有小数部分,仅返回格式化后的整数部分。
关键代码
def solution(s):
zhengshu = ""
xiaoshu = ""
if "." not in s:
zhengshu = str(int(s))
else:
lst = s.split(".")
zhengshu = str(int(lst[0]))
xiaoshu = lst[1]
start = len(zhengshu) % 3
ans = ""
for i in range(len(zhengshu)):
if i != 0 and i % 3 == start:
ans += ","
ans += zhengshu[i]
if xiaoshu != "":
ans += "."
ans += xiaoshu
return ans
这道题考察了字符串处理和格式化的能力,解题的核心在于理解数字的结构并合理拆解任务:
- 使用字符串方法去除前导零。
- 分离整数和小数部分,分别处理。
- 利用 Python 内置方法简化千分位格式化的逻辑。
代码时间复杂度为 O(n) ,其中 n 是输入字符串的长度,非常适合处理较长的数字字符串。