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

66 阅读3分钟

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

小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' 要解决这个问题,我们需要对输入的数字字符串进行两个主要操作:

  1. 去掉前面的无用零:如果数字的整数部分有多余的零,我们需要去掉它们。
  2. 添加千分位逗号:整数部分每三位添加一个逗号,同时保留小数部分。

解决思路:

  1. 去掉前导零:首先,我们可以用 str.lstrip('0') 去掉数字字符串的前导零。如果整数部分为空字符串(例如输入是 "000000"),那么我们需要将其设为 "0"
  2. 分割整数部分和小数部分:将数字字符串根据小数点分成两部分,整数部分和小数部分。小数部分需要保留完整,因此我们需要小心地处理小数部分。
  3. 添加千分位逗号:整数部分按每三位分组,使用逗号分隔。
  4. 重新组合:最后,将格式化后的整数部分和小数部分(如果有)重新组合。

代码实现:

pythonCopy Code
def format_number(s: str) -> str:
    # 去掉前导零
    s = s.lstrip('0')
    
    # 处理空字符串的情况(例如 "0000" 会变为空字符串)
    if s == '' or s == '.':
        s = '0'
    
    # 如果有小数点,分开整数和小数部分
    if '.' in s:
        integer_part, decimal_part = s.split('.')
    else:
        integer_part = s
        decimal_part = ''
    
    # 添加千分位逗号
    integer_part = '{:,}'.format(int(integer_part))  # 使用Python的格式化功能
    
    # 组合整数部分和小数部分
    if decimal_part:
        return f'{integer_part}.{decimal_part}'
    else:
        return integer_part

# 测试样例
print(format_number("1294512.12412"))  # '1,294,512.12412'
print(format_number("0000123456789.99"))  # '123,456,789.99'
print(format_number("987654321"))  # '987,654,321'

解释:

  1. 去掉前导零:通过 s.lstrip('0') 去除字符串中的所有前导零。如果去掉之后字符串为空(如输入为 "00000"),我们将其设置为 "0",以保证不会出现空的整数部分。
  2. 分割整数部分和小数部分:通过 split('.') 来分割整数部分和小数部分。如果没有小数点,则小数部分为空字符串。
  3. 格式化整数部分:通过 '{:,}'.format(int(integer_part)) 来格式化整数部分,:, 会自动为整数部分添加千分位逗号。
  4. 返回结果:如果存在小数部分,我们将整数部分和小数部分重新组合;否则,只返回格式化后的整数部分。

测试用例:

  1. 输入:"1294512.12412"
    输出:"1,294,512.12412"
  2. 输入:"0000123456789.99"
    输出:"123,456,789.99"
  3. 输入:"987654321"
    输出:"987,654,321"

注意事项:

  • 输入可能有前导零,需要去掉。
  • 处理小数部分时,要确保完整保留小数,不能舍去。
  • 如果没有小数部分,输出应仅包含整数部分。