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

147 阅读4分钟

这道题的核心任务是将用户输入的数字字符串转换成符合千分位格式的数字,同时保留小数部分,并去掉多余的前导零。我们可以按以下步骤进行分析并实现代码。

题目分析

给定一个字符串表示的数字,要求:

  1. 去掉前导零。
  2. 将整数部分按照千分位格式化。
  3. 保留小数部分的原始内容(不做千分位处理)。
  4. 如果输入没有小数部分,仅对整数部分进行千分位格式化。

解决思路

我们可以将这个任务分为以下几个步骤:

  1. 去除前导零:使用字符串方法 lstrip 去掉数字开头的无用零。
  2. 分离整数部分和小数部分:通过判断小数点的存在来区分整数和小数部分。
  3. 对整数部分进行千分位格式化:使用 Python 的格式化功能,将整数部分转换为带千分位的形式。
  4. 拼接结果:将千分位后的整数部分和原始的小数部分拼接成最终结果。

代码实现

以下是完整代码,并附上每一步的解释:

def solution(s: str) -> str:
    # 去掉前导零,处理小数点
    s = s.lstrip('0') or '0'
    
    # 将整数部分和小数部分分离
    if '.' in s:
        integer_part, decimal_part = s.split('.')
        formatted_integer = f"{int(integer_part):,}"
        return f"{formatted_integer}.{decimal_part}"
    else:
        # 仅有整数部分
        return f"{int(s):,}"

# 测试样例
if __name__ == '__main__':
    print(solution("1294512.12412") == '1,294,512.12412')
    print(solution("0000123456789.99") == '123,456,789.99')
    print(solution("987654321") == '987,654,321')

详细解释

  1. 去掉前导零

    • s.lstrip('0'):去除字符串开头的所有 '0'
    • or '0':如果去掉前导零后字符串为空,返回 '0'。这样可以处理输入为 0000 的情况。
    • 示例:"0000123" 去掉前导零后变为 "123"
  2. 分离整数部分和小数部分

    • if '.' in s: 通过判断 '.' 是否在字符串中来确定是否包含小数部分。
    • integer_part, decimal_part = s.split('.'):如果包含小数点,通过 split('.') 将字符串分割成整数部分和小数部分。
    • decimal_part = None:如果不包含小数部分,将 decimal_part 设置为 None,以便在拼接时进行判断。
    • 示例:"1294512.12412" 分割后得到 integer_part="1294512"decimal_part="12412"
  3. 对整数部分进行千分位格式化

    • f"{int(integer_part):,}":通过格式化字符串 f"{:,}",将整数部分转换为带千分位逗号的字符串。使用 int() 将整数部分转为整数类型,以确保千分位格式化能正常应用。
    • 示例:"1294512" 格式化后变为 "1,294,512"
  4. 拼接结果

    • f"{formatted_integer}.{decimal_part}":如果存在小数部分,拼接格式化后的整数部分和小数部分,确保小数部分保持原样。
    • formatted_integer:如果没有小数部分,直接返回格式化后的整数部分。
    • 示例:对于输入 "0000123456789.99",拼接结果为 "1,234,567,889.99"

用到的 Python 函数和方法

  • str.lstrip(chars):去掉字符串左边的指定字符。这里 chars'0',表示去掉前导零。
    "0000123".lstrip('0')  # 输出: "123"
    
  • str.split(sep):以 sep 为分隔符将字符串分割成列表。这里 sep'.',用于分离整数部分和小数部分。
    "123.456".split('.')  # 输出: ['123', '456']
    
  • 格式化字符串 f"{value:,}":使用格式化字符串中的 , 来表示千分位分隔符,将整数部分格式化为带逗号的形式。
    f"{1234567:,}"  # 输出: "1,234,567"
    

时间复杂度和空间复杂度

  • 时间复杂度:O(n),其中 n 是字符串的长度。分割和格式化操作都是线性时间复杂度。
  • 空间复杂度:O(n),需要存储格式化后的结果字符串。

测试样例

运行测试用例:

if __name__ == '__main__':
    print(solution("1294512.12412") == '1,294,512.12412')    # True
    print(solution("0000123456789.99") == '123,456,789.99')  # True
    print(solution("987654321") == '987,654,321')            # True

以上代码的输出结果符合预期,并完成了题目要求。