方向一:学习方法与心得
数字字符串格式化题目解析:
问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
思路提示:
问题理解
你需要将一个数字字符串格式化为带千分位逗号的格式,并且保留小数部分。此外,还需要去除字符串前面的无用零。
数据结构与算法步骤
-
去除前导零:首先需要去除字符串前面的无用零。可以使用
lstrip('0')方法来实现。 -
分离整数和小数部分:检查字符串中是否包含小数点
.,如果有,则分离出整数部分和小数部分。如果没有小数点,则整数部分就是整个字符串,小数部分为空。 -
格式化整数部分:
- 反转整数部分字符串,这样可以从后往前每三位加一个逗号。
- 使用
join方法,每三位加一个逗号。 - 再次反转字符串,恢复原来的顺序。
-
合并整数和小数部分:将格式化后的整数部分和小数部分合并,返回结果。
代码详解
def solution(s: str) -> str:# 去除前导零 s = s.lstrip('0')
# 分离整数和小数部分
if '.' in s:
integer_part, fractional_part = s.split('.')
else:
integer_part, fractional_part = s,
# 格式化整数部分
if integer_part:
integer_part = ''.join(reversed(integer_part)) # 反转整数部分
integer_part = ','.join(integer_part[i:i+3] for i in range(0, len(integer_part), 3)) # 每三位加一个逗号
integer_part = ''.join(reversed(integer_part)) # 再次反转回来
# 合并整数和小数部分
if fractional_part:
return f"{integer_part}.{fractional_part}"
else:
return integer_part`
知识总结:
字符串操作
-
去除前导零:
lstrip('0'):用于去除字符串左侧的指定字符(这里是0)。
-
分离整数和小数部分:
split('.'):根据小数点.将字符串分割成整数部分和小数部分。
字符串反转
-
反转字符串:
reversed(string):返回一个反转的迭代器。''.join(reversed(string)):将反转后的字符串重新组合成一个字符串。
字符串格式化
-
每三位加一个逗号:
join方法:用于将一个可迭代对象中的元素连接成一个字符串。- 使用列表推导式和切片:
','.join(string[i:i+3] for i in range(0, len(string), 3)),将字符串每三位分组并用逗号连接。
字符串拼接
-
合并整数和小数部分:
- 使用 f-string:
f"{integer_part}.{fractional_part}",将整数部分和小数部分合并成一个字符串。
- 使用 f-string:
代码结构
-
函数定义:
def solution(s: str) -> str::定义一个函数solution,接受一个字符串参数s,并返回一个字符串。
-
条件判断:
if '.' in s::检查字符串中是否包含小数点。if integer_part::检查整数部分是否为空。
-
测试代码:
if __name__ == '__main__'::用于测试函数的代码块。print(solution("1294512.12412") == '1,294,512.12412'):测试函数的输出是否符合预期。。