问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
测试样例
样例1:
输入:
s = "1294512.12412"
输出:'1,294,512.12412'
样例2:
输入:
s = "0000123456789.99"
输出:'123,456,789.99'
样例3:
输入:
s = "987654321"
输出:'987,654,321'
题解
要解决这个问题,我们可以将任务分解为几个步骤:
- 去除前导零:如果数字字符串有前导零,并且它不是小数点前唯一的零(例如
0.123),我们需要去掉这些多余的零。 - 处理整数部分和小数部分:将数字字符串分割成整数部分和小数部分,然后单独处理。
- 添加千分位逗号:对于整数部分,从右向左每三位插入一个逗号。
- 重新组合:将处理后的整数部分与小数部分(如果有的话)用小数点连接起来。
下面是具体的实现代码以及解释:
def solution(s: str) -> str:
# 去除前导零
s = s.lstrip('0')
# 如果移除了所有字符(即输入是"0"或多个"0"),则返回'0'
if not s:
return '0'
# 分割整数部分和小数部分
parts = s.split('.')
integer_part, decimal_part = parts[0], parts[1] if len(parts) > 1 else ''
# 对整数部分添加千分位逗号
formatted_integer = '{:,}'.format(int(integer_part))
# 重新组合整数部分和小数部分
result = formatted_integer
if decimal_part:
result += '.' + decimal_part
return result
if __name__ == '__main__':
print(solution("1294512.12412") == '1,294,512.12412') # 应该输出True
print(solution("0000123456789.99") == '123,456,789.99') # 应该输出True
print(solution("987654321") == '987,654,321') # 应该输出True
详细解释
s.lstrip('0'): 这个方法用于删除字符串s左边的所有'0'。但要注意,如果整个字符串都是'0'或者只有一个小数点前面的'0'时,这个操作会完全删除它们,所以我们需要额外检查这种情况。split('.'): 将字符串按小数点分割,得到一个列表,其中第一个元素是整数部分,如果有第二个元素,则是小数部分。'{:,}'.format(int(integer_part)): 使用Python的格式化功能,在整数部分每三个数字之间插入逗号。这里使用int()转换是为了确保没有前导零。- 最后,根据是否有小数部分来决定是否加上小数点和小数部分。
这种处理方式保证了即使输入的是纯整数、纯小数或是带有前导零的情况,都能正确地转换为带千分位逗号的格式。