数字字符串格式化
问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
测试样例
样例1:
输入:
"1294512.12412"
输出:'1,294,512.12412'
样例2:
输入:
s = "0000123456789.99"
输出:'123,456,789.99'
样例3:
输入:
s = "987654321"
输出:'987,654,321'
分析题目
根据题目描述我们发现:
- 输入值为数字内容的字符串
- 数字内容有,不存在小数部分、存在小数部分、存在前置零;三种
- 结果输出为带千分位逗号的数字内容字符串
解题思路
根据样例输入和输出的内容我们发现:
- 小数部分不做处理,所有需要先判断是否存在小数部分,再将整数
a和小数b分别接收,存在小数的正常接收,不存在小数的设置为空字符串''; - 整数部分格式化为一个带有千位分隔符的字符串
"{:,}".format(int(a)) - 最后判断小数部分
b,如果为空则只输出整数部分a,不为空则输出整数部分和小数部分中间用小数点.隔开{a}.{b}
解题步骤
-
判断是否有小数点
首先,检查字符串s是否包含小数点.:- 如果包含小数点,则分割出整数部分和小数部分。
- 如果不包含小数点,则整个字符串视为整数部分,小数部分为空。
if '.' in s: a, b = s.split('.') else: a, b = s, '' -
去除整数部分的前导零
使用int(a)将整数部分a转换为整数类型,这样可以自动去除任何前导零(如000123会变成123)。然后再将a转换回字符串。a = str(int(a)) -
格式化整数部分
使用字符串格式化方法'{:,}'.format(...),将整数部分格式化为每三位用逗号分隔的形式。例如1234567会变成1,234,567。a = '{:,}'.format(int(a)) -
拼接整数和小数部分
判断是否有小数部分:- 如果有小数部分
b,则用f"{a}.{b}"拼接整数和小数部分。 - 如果没有小数部分,只返回格式化后的整数部分
a。
if b: return f"{a}.{b}" else: return a - 如果有小数部分
最终代码:
def solution(s: str) -> str:
if '.' in s:
a, b = s.split('.')
else:
a = s
b = ""
a = str(int(a))
a = '{:,}'.format(int(a))
if b:
return f'{a}.{b}'
else:
return a
if __name__ == '__main__':
print(solution("1294512.12412") == '1,294,512.12412')
print(solution("0000123456789.99") == '123,456,789.99')
print(solution("987654321") == '987,654,321')
运行结果:
运用到的知识点:
1. 字符串操作
in操作符:用于检查子字符串是否在字符串中。在代码中,if '.' in s:判断字符串s中是否包含小数点.,以确定输入是否包含小数部分。- 字符串分割
split():split()方法将字符串拆分为列表。s.split('.')将字符串s按.进行分割,并返回一个包含整数部分和小数部分的列表。 - 字符串格式化
f"{a}.{b}":Python 3.6 引入了 f 字符串,可以将变量值直接插入字符串中,简洁直观。在代码中,f"{a}.{b}"拼接格式化后的整数部分和小数部分,形成最终结果。
2. 类型转换
int()类型转换:将字符串转换为整数,这里是为了去除前导零。例如,int("000123")会返回123。通过int()转换后,str(int(a))会去掉a中的所有前导零。str()类型转换:将整数转换回字符串,方便进行后续字符串格式化和拼接操作。
3. 字符串格式化
'{:,}'.format(...):这是 Python 的字符串格式化方法之一,逗号,表示每三位添加一个逗号。例如,'{:,}'.format(1234567)结果是"1,234,567",这是一种国际通用的数字分隔格式,适用于千位数以上的数字。这种格式化可以提升代码的可读性和输出的美观性。