青训营刷题笔记:带千分位格式化
问题描述
小M在工作时需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并保留小数部分。此外,输入可能包含前导的无效 0,这些也需要去掉。
要求
- 输入为字符串格式。
- 输出为字符串,保留千分位逗号和小数部分。
- 特殊情况如纯前导零或只有小数点需处理。
测试样例
样例1
输入:s = "1294512.12412"
输出:'1,294,512.12412'
样例2
输入:s = "0000123456789.99"
输出:'123,456,789.99'
样例3
输入:s = "987654321"
输出:'987,654,321'
解题思路
-
去除前导零:
使用lstrip('0')删除数字前的无效0,如果处理后为空字符串,则特殊返回0。 -
分离整数和小数部分:
使用split('.')将字符串按小数点分割,单独处理整数和小数部分。 -
格式化整数部分:
将整数部分从右向左每三位插入一个逗号。利用字符串切片结合列表解析来实现。 -
拼接结果:
根据是否存在小数部分,将整数和小数部分拼接。 -
特殊情况:
- 输入仅为
0或.0,特殊返回'0'。 - 输入仅为小数点,应返回
'0'。
- 输入仅为
代码实现
def solution(s):
# 去除前导零
s = s.lstrip('0')
# 处理“0”这个特例
if s == '' or s == '.':
return '0'
# 分离整数部分和小数部分
if '.' in s:
integer_part, decimal_part = s.split('.')
else:
integer_part, decimal_part = s, ''
# 格式化整数部分,加千分位逗号
integer_part = integer_part[::-1] # 反转字符串以便于插入逗号
formatted_integer_part = ','.join([integer_part[i:i + 3] for i in range(0, len(integer_part), 3)])[::-1]
# 拼接结果
if decimal_part:
return f'{formatted_integer_part}.{decimal_part}'
else:
return formatted_integer_part
测试结果
# 测试样例
print(solution("1294512.12412")) # 输出:'1,294,512.12412'
print(solution("0000123456789.99")) # 输出:'123,456,789.99'
print(solution("987654321")) # 输出:'987,654,321'
print(solution("0000.001")) # 输出:'0.001'
print(solution("0000000")) # 输出:'0'
print(solution(".")) # 输出:'0'
总结
本题主要考查字符串处理与格式化输出的能力。
通过灵活使用字符串切片、字符串方法 lstrip 和列表解析,可以简洁高效地完成格式化需求。带千分位格式化问题总结
本题要求将用户输入的数字字符串转换为带千分位逗号的格式,同时保留小数部分,并去除前导的无效零。核心考点是字符串的分割、处理和拼接操作,以及对特殊情况的正确处理。
解题思路
-
去除前导零:
使用lstrip('0')去掉数字前多余的0,处理后若字符串为空或仅剩小数点,需特殊返回'0'。 -
分割整数与小数部分:
通过split('.')方法,将字符串按小数点分割,分别得到整数部分和小数部分。若没有小数点,则小数部分为空。 -
格式化整数部分:
借助字符串切片和列表解析,从右到左每隔三位插入一个逗号。具体实现时,先将整数部分反转,分组插入逗号后再反转回来。 -
拼接结果:
判断是否有小数部分,若存在则拼接“整数部分 + 小数部分”,否则直接返回格式化后的整数部分。 -
特殊情况:
- 输入全为零(如
"0000"),返回'0'。 - 仅为小数点(如
"."),返回'0'。 - 输入中含有小数位或整数部分单独存在,都能正确格式化。
- 输入全为零(如
实现效果
代码通过对字符串的逐步拆解与处理,能高效完成任务。样例如输入 "0000123456789.99",输出为 '123,456,789.99';输入 "987654321",输出为 '987,654,321'。
难点与收获
本题的难点在于正确处理多种输入边界情况,如仅有小数点、全零或前导零等。通过精确的逻辑判断和对字符串方法的灵活使用,能保证代码的鲁棒性。
解决本题不仅巩固了字符串操作的基础,也提升了对格式化问题的处理能力。