数字字符串格式化 | 豆包MarsCode AI刷题

87 阅读2分钟

问题描述

小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'

def solution(s: str) -> str:
    # write code here
    result = s.lstrip('0') or '0'
    if '.' in result:
        result_left, result_right = result.split('.')
    else:
        result_left = result
        result_right = ''
    if result_right != '':
        result_right = '.' + result_right

    left_list = []
    result_left = list(result_left)
    i = len(result_left) % 3
    j = i
    while(i + 3 < len(result_left)):
        left_list.append(''.join(result_left[i:i + 3]))
        left_list.append(',')
        i = i + 3

    left_list = str(''.join(left_list))
    if j != 0 and len(result_left) > 3:
        result = ''.join(result_left[:j]) + ',' + left_list + ''.join(result_left[i:]) + result_right
    elif j == 0:
        result = left_list + ''.join(result_left[i:]) + result_right
    else:
        return result
    print(result_left)
    print(result)
    return result

代码思路解释

  1. 去除前导零

    • 使用 s.lstrip('0') 去除字符串 s 前面的所有 0
    • 如果去除后字符串为空,则返回 '0',以确保至少有一个数字。
  2. 分割整数部分和小数部分

    • 检查字符串中是否包含小数点 .
    • 如果包含小数点,则将字符串分割为整数部分 result_left 和小数部分 result_right
    • 如果不包含小数点,则整数部分为整个字符串,小数部分为空。
  3. 处理小数部分

    • 如果小数部分不为空,则在前面加上小数点 .
  4. 处理整数部分

    • 将整数部分转换为列表 result_left,以便于插入逗号。
    • 计算整数部分的长度模 3 的余数 i,这个余数表示从哪里开始插入逗号。
    • 使用 while 循环,每隔 3 个字符插入一个逗号 ,,直到剩余部分不足 3 个字符。
  5. 拼接结果

    • 根据 i 的值,决定如何拼接整数部分和小数部分。
    • 如果 i 不为 0 且整数部分长度大于 3,则在适当位置插入逗号。
    • 如果 i 为 0,则直接拼接整数部分和小数部分。
  6. 返回结果

    • 最终返回拼接好的字符串。

总结

您的代码逻辑基本上是正确的,主要思路是通过去除前导零、分割整数和小数部分、插入逗号来实现千分位格式化。不过,代码中有一些地方可以优化,例如拼接字符串的方式可以更简洁一些。如果您有具体的问题或需要进一步的优化建议,请告诉我!