问题重述
小 M 在工作中面临一个数字字符串处理的任务。具体来说,给定一个用户输入的数字字符串,这个字符串可能是整数部分不带千分位逗号,也可能带有小数部分。小 M 需要将其转换为带有千分位逗号的格式,同时如果输入的字符串前面有不必要的 0,要将这些 0 去除掉,并且保留小数部分的原有格式。通过编写程序来实现这个功能,并给出了三个测试样例,分别涵盖了有小数部分、有前导 0 和只有整数部分的情况。
题目分析与思路
本题要求我们将不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且要保留小数部分。同时,如果数字字符串前面有无用的 0,我们需要将其精简掉。
问题的关键在于对数字字符串进行处理,需要考虑整数部分和小数部分的不同处理方式,以及去除前导 0 的操作。
代码解析
函数部分(solution 函数) :
-
parts = s.split('.'):这行代码将输入的字符串s按照小数点进行分割,得到一个列表parts。如果字符串中没有小数点,则列表中只有一个元素,即整数部分。如果有小数点,则列表中有两个元素,分别是整数部分和小数部分。 -
integer_part = parts[0].lstrip('0'):这里对分割后的整数部分(列表parts的第一个元素)使用lstrip('0')方法去除前导零。 -
if integer_part == '': integer_part = '0':如果去除前导零后的整数部分为空字符串,说明输入的字符串全是零,将整数部分设为'0'。 -
formatted_integer = '{:,}'.format(int(integer_part)):这行代码使用字符串格式化的方法将整数部分转换为带千分位逗号的格式。首先将整数部分转换为整数类型,然后使用'{:,}'格式说明符进行格式化。 -
if len(parts) > 1::判断输入的字符串是否有小数部分,如果parts的长度大于 1,说明有小数部分。return f'{formatted_integer}.{parts[1]}':如果有小数部分,将格式化后的整数部分和小数部分用小数点连接起来并返回。
-
else::如果没有小数部分。return formatted_integer:直接返回格式化后的整数部分。
测试部分(__main__部分) :
- 分别调用
solution函数对三个测试样例进行处理,并将结果与预期输出进行比较,使用print函数输出比较的结果(布尔值)。如果结果为True,说明函数在该测试样例上运行正确;如果为False,则说明函数在该测试样例上运行错误。
知识总结
一、字符串处理
-
split方法:用于将字符串按照指定的分隔符进行分割,得到一个字符串列表。在本题中,按照小数点将输入的数字字符串分割为整数部分和小数部分。 -
lstrip方法:用于去除字符串左侧指定的字符,本题中用来去除整数部分的前导零。
二、字符串格式化
'{:,}'.format():这是一种字符串格式化的方法,可以将整数转换为带千分位逗号的格式。在本题中,用于将处理后的整数部分格式化为带千分位逗号的形式。
三、条件判断
- 使用
if语句判断整数部分去除前导零后是否为空,以及输入的字符串是否有小数部分,根据不同情况进行相应的处理。