数字字符串格式化

269 阅读4分钟

本题旨在将用户所输入的不带千分位逗号的数字字符串,转换为带有千分位逗号的规范格式,并且需遵循以下要求:

若存在小数部分,则予以保留。 去除数字字符串开头可能存在的前导零。 严格按照千分位规则输出,即从右向左,每三位数字之间添加一个逗号,例如将数字转换为类似“1,294,512”这样的格式。

以下是本题的关键要点:

输入的字符串有可能包含小数点,例如“1294512.12412”。 输入字符串也可能仅包含整数部分,如“987654321”。 甚至输入字符串可能存在前导零,像“0000123456789.99”这种情况。

输出的格式必须契合千分位规则,从右向左,每三位数字之间添加一个逗号,例如:1,294,512。

解题思路

1. 去除无用的前导零

运用字符串的 str.lstrip('0') 方法来去除前导零。在此过程中,需特别留意一些极端情况的处理:

若去除前导零后字符串变为空字符串,那么直接返回“0”。 倘若字符串在去除前导零后仅剩下一个小数点“.”,同样返回“0”。

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

若字符串中包含“.”,则表明存在小数部分,此时可借助 str.split('.') 方法将字符串拆分为整数部分和小数部分。 若字符串中不包含“.”,则直接将整个字符串视作整数部分。

3. 格式化整数部分

利用 Python 的格式化方法,为整数部分添加千分位逗号:f"{int(integer_part):,}"。在此处,int() 函数会自动将字符串转换为整数并移除多余的前导零。

4. 组合结果

若存在小数部分,最终的输出结果即为整数部分 + 小数点 + 小数部分。 若不存在小数部分,仅输出格式化后的整数部分。

以下是对应的代码实现:

def demo():
    # 去除前导零
    s = s.lstrip('0')

    # 如果去除前导零后为空或是只有一个点
    if not s or s == '.':
        return '0'

    # 分割整数和小数部分
    if '.' in s:
        integer_part, decimal_part = s.split('.')
    else:
        integer_part, decimal_part = s, ''

    # 格式化整数部分
    integer_part = f"{int(integer_part):,}"

    # 返回结果
    return f"{integer_part}.{decimal_part}" if decimal_part else integer_part

图解和代码详解

样例 1:输入 "1294512.12412"

  • 去除前导零:由于字符串中原本就没有前导零,所以字符串保持不变。
  • 拆分整数和小数部分:
    • 整数部分:1294512
    • 小数部分:12412
  • 格式化整数部分:
    • f"{int(1294512):,}" 经过计算得到 “1,294,512”
  • 组合结果:
    • 输出:1,294,512.12412

样例 2:输入 "0000123456789.99"

  • 去除前导零:
    • "0000123456789.99".lstrip('0') 执行后得到 “123456789.99”
  • 拆分整数和小数部分:
    • 整数部分:123456789
    • 小数部分:99
  • 格式化整数部分:
    • f"{int(123456789):,}" 得出 “123,456,789”
  • 组合结果:
    • 输出:123,456,789.99

样例 3:输入 "987654321"

  • 去除前导零:因为原本就无前导零,所以字符串不变。
  • 拆分整数和小数部分:
    • 整数部分:987654321
    • 小数部分:无
  • 格式化整数部分:
    • f"{int(987654321):,}" 得到 “987,654,321”
  • 组合结果:
    • 输出:987,654,321

时间复杂度分析

  • 去除前导零:

    • str.lstrip('0') 的时间复杂度为 O(n)O(n),其中 nn 为字符串的长度。
  • 拆分整数和小数部分:

    • str.split('.') 的时间复杂度为 O(n)O(n)
  • 格式化整数部分:

    • Python 格式化整数(添加逗号)的复杂度取决于整数的位数,通常为 O(log10(x))O(\log_{10}(x)),对于字符串输入而言近似为 O(n)O(n)
  • 组合结果:

    • 拼接字符串的时间复杂度为 O(m)O(m),其中 mm 是输出字符串的长度。

综合来看,总的时间复杂度为 O(n)O(n),处理速度较为迅速。

总结

  • 核心知识点:

    • 字符串操作,涵盖去除前导零以及拆分小数部分。
    • Python 格式化字符串的技巧,特别是添加千分位逗号的方法。
  • 边界情况处理:

    • 妥善处理输入为空字符串或者全是前导零的情况。
    • 精准应对只有小数部分或者没有小数部分的输入。
  • 优化:

    • 通过使用内置函数 lstrip 和格式化方法,有效避免了手动处理复杂逻辑,提升了代码的简洁性与高效性。
  • 通用性:

    • 本代码简洁且高效,能够适用于处理任意格式的数值字符串,具有较强的通用性与实用性。