题目描述
给定一个数字字符串s,该字符串可能包含前导零,也可能是一个浮点数。我们的任务是移除所有前导零,并将整数部分转换为带有千分位逗号的格式,同时保持原有的小数部分不变。
解决方案
为了有效地解决这个问题,我们可以遵循以下步骤来设计算法:
- 去除前导零:首先,我们需要从输入字符串中移除所有的前导零。这可以通过Python中的
lstrip('0')方法轻松实现。如果原始字符串全是零,则最终结果应为"0"。 - 分离整数和小数部分:接下来,检查字符串中是否含有小数点。如果有,使用
split('.')方法将字符串分割成两部分:整数部分和小数部分。如果没有小数点,那么整个字符串就是整数部分,小数部分为空。 - 格式化整数部分:对于整数部分,我们需要从右向左遍历每一个字符,并在每三个字符之后插入一个逗号。这里需要注意的是,我们只在非首位的地方添加逗号,以避免不必要的符号出现。
- 合并整数和小数部分:最后一步是将格式化后的整数部分与小数部分重新组合起来。如果有小数部分,就在两者之间加上小数点;如果没有小数部分,直接返回格式化后的整数部分。
示例代码
下面是一个基于上述逻辑实现的Python函数,用于完成数字字符串的格式化任务:
def solution(s: str) -> str:
# 去除前导零
s = s.lstrip('0')
# 如果字符串全是零,返回"0"
if not s:
return "0"
# 分离整数和小数部分
if '.' in s:
integer_part, fractional_part = s.split('.')
else:
integer_part, fractional_part = s, ''
# 格式化整数部分
formatted_integer = ''
for i, char in enumerate(reversed(integer_part)):
# 仅在不是第一位且每三位后添加逗号
if i > 0 and i % 3 == 0:
formatted_integer = ',' + formatted_integer
formatted_integer = char + formatted_integer
# 合并整数和小数部分
if fractional_part:
return formatted_integer + '.' + fractional_part
else:
return formatted_integer