3. 数字字符串格式化 思路与代码分析| 豆包MarsCode AI刷题

48 阅读2分钟

问题描述

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

思路解析

这个问题的核心是处理字符串的格式化。具体要求如下:

  1. 去除字符串中的无用前导零

    • 用户输入的数字字符串可能包含不必要的前导零(例如 "0000123.45"),需要移除这些前导零。
    • 如果移除后整个字符串为空或只剩一个 ".",则返回 "0"
  2. 分离整数和小数部分

    • 利用小数点 . 将输入分为整数部分和小数部分。
    • 如果字符串中没有小数点,则认为整个字符串是整数部分。
  3. 对整数部分进行千分位格式化

    • 使用 Python 的字符串格式化功能(f"{value:,}")将整数部分按千分位添加逗号分隔符。
  4. 拼接小数部分(如果存在)

    • 在格式化后的整数部分后添加小数部分。
  5. 输出结果

    • 如果有小数部分,输出 整数部分.小数部分
    • 如果没有小数部分,仅输出格式化后的整数部分。

代码解析

下面是代码的逐步解析:

1. 去除无用的前导零

s = s.lstrip('0')
  • lstrip('0') 去除字符串左侧的所有 '0'
  • 如果去掉前导零后,字符串变为空或只剩下一个 ".",直接返回 "0"
if s == '' or s == '.':
    return '0'

2. 分离整数部分和小数部分

if '.' in s:
    int_part, dec_part = s.split('.')
else:
    int_part, dec_part = s, ''
  • 检查字符串是否包含 '.'

    • 如果有,使用 split('.') 分离整数和小数部分。
    • 如果没有,将整个字符串视为整数部分,小数部分为空字符串 ''

3. 对整数部分进行千分位格式化

int_part = int(int_part) if int_part else 0
formatted_int_part = f"{int_part:,}"
  • 将整数部分转换为整数类型(int(int_part)),以去除可能剩下的无效零(如 "0000")。
  • 利用 f"{int_part:,}" 实现千分位格式化,例如 1294512 转换为 "1,294,512"

4. 拼接小数部分

if dec_part:
    return f"{formatted_int_part}.{dec_part}"
else:
    return formatted_int_part
  • 如果小数部分存在,则将格式化后的整数部分与小数部分拼接。
  • 如果小数部分为空,仅返回格式化后的整数部分。

5. 主函数

  • 保留本身提供的几个测试用例,验证函数的正确性。