文科生勇闯ai刷题3. 数字字符串格式化 | 豆包MarsCode AI刷题

181 阅读4分钟

数字字符串格式化问题描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。

初始解题代码

def format_number(num_str):
    # 去除数字字符串前面的无用0
    num_str = num_str.lstrip('0')
    if num_str == '':  # 如果字符串全是0,返回0
        return '0'
    # 分离整数部分和小数部分
    if '.' in num_str:
        integer_part, decimal_part = num_str.split('.')
    else:
        integer_part, decimal_part = num_str, ''
    # 为整数部分添加千分位逗号
    integer_part = integer_part.replace(',', '')  # 先去除可能存在的逗号
    integer_part = '{:,}'.format(int(integer_part))  # 使用format添加千分位逗号
    # 组合整数部分和小数部分
    return '{}.{}'.format(integer_part, decimal_part) if decimal_part else integer_part

# 示例
print(format_number("1000.123"))  # 输出: 1,000.123
print(format_number("000123.456"))  # 输出: 123.456
print(format_number("0000"))  # 输出: 0
print(format_number(".123"))  # 输出: 0.123

使用豆包Marscode检查

在处理输入字符串 ".123" 时,integer_part 变量为空字符串 '',而 int('') 会引发 ValueError。你需要在尝试转换为整数之前,确保 integer_part 不是空字符串。

豆包解题思路

问题理解

你需要将一个不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。此外,输入的数字字符串前面可能会有无用的 0,这些也需要精简掉。

数据结构选择

  • 字符串:输入和输出都是字符串格式。
  • 整数和小数部分:需要将字符串分离为整数部分和小数部分。

算法步骤

  1. 去除前导零

    • 使用 lstrip('0') 方法去除字符串前面的无用 0
    • 如果去除后字符串为空,说明原字符串全是 0,返回 '0'
  2. 分离整数部分和小数部分

    • 使用 split('.') 方法将字符串分离为整数部分和小数部分。
    • 如果没有小数点,整数部分就是原字符串,小数部分为空字符串。
  3. 处理整数部分

    • 去除整数部分中可能存在的逗号。
    • 如果整数部分为空字符串,设置为 '0'
    • 使用 '{:,}'.format(int(integer_part)) 方法为整数部分添加千分位逗号。
  4. 组合整数部分和小数部分

    • 如果小数部分不为空,将整数部分和小数部分组合成最终结果。
    • 如果小数部分为空,直接返回整数部分。

豆包Marscode解题代码

def solution(num_str):
    # 去除数字字符串前面的无用0
    num_str = num_str.lstrip('0')
    if num_str == '':  # 如果字符串全是0,返回0
        return '0'
    # 分离整数部分和小数部分
    if '.' in num_str:
        integer_part, decimal_part = num_str.split('.')
    else:
        integer_part, decimal_part = num_str, ''
    # 为整数部分添加千分位逗号
    integer_part = integer_part.replace(',', '')  # 先去除可能存在的逗号
    if integer_part == '':  # 如果整数部分为空,设置为'0'
        integer_part = '0'
    integer_part = '{:,}'.format(int(integer_part))  # 使用format添加千分位逗号
    # 组合整数部分和小数部分
    return '{}.{}'.format(integer_part, decimal_part) if decimal_part else integer_part

# 示例
print(solution("1294512.12412"))  
print(solution("0000123456789.99")) 
print(solution("987654321"))  

其他情况

如果输入的数字是负数,我们需要确保负号被保留,并且在格式化数字时不会影响到负号。我们可以在处理整数部分和小数部分之前先提取负号,然后对剩余的数字进行格式化,最后再将负号添加回去

学习体会

作为基础薄弱的文科生,在使用AI辅助代码学习的过程中,我体会到了个性化学习的重要性。通过向豆包提问,ai能够根据我的学习节奏提供知识点。即时反馈功能让我能够迅速识别并修正代码中的错误,这种互动性极大地提高了我的学习效率。同时,AI整合的丰富学习资料让我接触到了更广泛的编程知识,而自动化的工具则帮我节省了大量时间,让我能够专注于学习和创造。