青训营X豆包MarsCode 技术训练营 | 豆包MarsCode AI 刷题

79 阅读3分钟

问题描述: 小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。 做题思路: 首先明确任务是将不带千分位逗号的数字字符串转换为带千分位逗号的格式,同时保留小数部分,并去除前面无用的 0。其次考虑分步骤解决问题,先处理去除无用的 0,再分别处理整数部分和小数部分,最后将处理后的结果组合起来。 具体步骤: 1.去除无用的0 使用字符串的lstrip('0')方法可以轻松去除字符串开头的 0,因为这个方法会删除字符串开头指定的字符,在这里指定为 '0'。 2.分离整数部分和小数部分 通过检查输入字符串中是否存在小数点来判断是否有小数部分。如果有小数点,使用split('.')方法将字符串分为整数部分和小数部分。如果没有小数点,整数部分为整个字符串,小数部分为空字符串。 3.处理整数部分添加千分位逗号 初始化一个空字符串用于存储添加千分位逗号后的整数部分。计算整数部分的长度,以便确定在什么位置添加逗号。遍历整数部分的每个字符,从左到右依次添加到新的字符串中。当满足从右往左数每三位数字的位置(即(length - i) % 3 == 1,其中i是当前遍历的字符位置,length是整数部分的长度)且不是最后一个字符时,添加一个逗号。 4.组合结果 如果小数部分不为空,将处理后的整数部分和小数部分用小数点连接起来作为最终结果返回.如果小数部分为空,直接返回处理后的整数部分。 代码部分:

def solution(s: str) -> str:
    # 先去除前面无用的 0
    s = s.lstrip('0')

    # 判断输入字符串中是否有小数点
    if '.' in s:
        # 如果有小数点,将字符串分割为整数部分和小数部分
        integer_part, decimal_part = s.split('.')
    else:
        # 如果没有小数点,整数部分为整个字符串,小数部分为空
        integer_part = s
        decimal_part = ""

    # 对整数部分添加千分位逗号
    integer_with_commas = ""
    length = len(integer_part)
    # 遍历整数部分的每个字符
    for i, char in enumerate(integer_part):
        integer_with_commas += char
        # 当满足从右往左数每三位数字的位置且不是最后一个字符时,添加逗号
        if (length - i) % 3 == 1 and i!= length - 1:
            integer_with_commas += ','

    # 如果有小数部分,将整数部分和小数部分组合起来返回
    if decimal_part:
        return f"{integer_with_commas}.{decimal_part}"
    # 如果没有小数部分,直接返回整数部分
    return integer_with_commas