Python代码:数字字符串格式化
在编程中,我们经常需要处理各种数据格式。今天,小M遇到了一个有趣的问题:他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。此外,有时候输入的数字字符串前面会有无用的0,这些也需要精简掉。本文将详细讲解如何解决这个问题,并提供相应的Python代码实现。
问题描述
小M在工作中遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
测试样例
- 输入:
s = "1294512.12412"输出:'1,294,512.12412' - 输入:
s = "0000123456789.99"输出:'123,456,789.99' - 输入:
s = "987654321"输出:'987,654,321'
解决方案
为了实现上述功能,我们可以按照以下步骤进行:
- 去除前导零:使用
lstrip('0')方法去除字符串前面的所有零。 - 分离整数和小数部分:检查字符串中是否包含小数点,如果包含则将其分割为整数部分和小数部分。
- 格式化整数部分:从右到左遍历整数部分,每三位插入一个逗号。
- 合并整数和小数部分:将格式化后的整数部分与小数部分重新组合。
下面是具体的Python代码实现:
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([x + (',' if i and i % 3 == 0 else '') for i, x in enumerate(reversed(integer_part))]))
# 合并整数和小数部分
result = integer_part
if fractional_part:
result += '.' + fractional_part
return result
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')
代码解析
去除前导零
s = s.lstrip('0')
这行代码使用了lstrip('0')方法,它会去除字符串开头的所有零。例如,"0000123456789.99"会变成"123456789.99"。
分离整数和小数部分
if '.' in s:
integer_part, fractional_part = s.split('.')
else:
integer_part, fractional_part = s, '
这段代码检查字符串中是否包含小数点。如果包含,则使用split('.')方法将其分割为整数部分和小数部分;如果不包含,则整个字符串作为整数部分,小数部分为空字符串。
格式化整数部分
if integer_part:
integer_part = ''.join(reversed([x + (',' if i and i % 3 == 0 else '') for i, x in enumerate(reversed(integer_part))]))
这段代码首先将整数部分反转,然后遍历每个字符。对于每三个字符插入一个逗号,最后再将结果反转回来。例如,"1234567"会被处理成"1,234,567"。
合并整数和小数部分
result = integer_part
if fractional_part:
result += '.' + fractional_part
这段代码将格式化后的整数部分与小数部分重新组合。如果存在小数部分,则在整数部分后面加上小数点和小数部分。
总结
通过以上步骤,我们可以有效地将不带千分位逗号的数字字符串转换为带千分位逗号的格式,并保留小数部分。同时,我们还去除了输入字符串前面的无用零。这种方法不仅简洁高效,而且易于理解和实现。