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

0 阅读3分钟

数字字符串格式化

题目描述

小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号 的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M 还发现,有时候输入的数字字符串前面会有无用的,这些也需要精 简掉。请你帮助小M编写程序,完成这个任务。 测试样例 样例1: 输入: s = "1294512.12412" 输出:‘1,294,512.12412' 样例2: 输入: s = "0000123456789.99" 输出:'123,456,789.99' 样例3: 输入: s = "987654321" 输出:'987,654,321'

题目解析

这个题目首先将小数点前和小数点后的字符分开进行处理

  1. 小数点前的字符需要去除前面为0的情况
  2. 小数点后的字符需要分开 因为小数点前的字符转为正常数字后需要带千分位逗号 当然还有一种情况就是不存在小数点的情况 这种情况时就不需要进行分割了

然后就是带千分位逗号的添加 其思路就是从低位到高位计数 当位数可以整除3即%3==0时可以进行逗号的添加 逗号的添加可以直接用字符串的拼接 或是使用切片的方式进行添加

以下是涉及到的基础知识:

  1. 字符串函数之lstrip函数

    lstrip方法主要用于去除字符串左边(开头部分)的空白字符或指定的字符,返回处理后的新字符串,原字符串本身不会被修改。

  2. split函数

    split方法用于按照指定的分隔符将字符串分割成多个子字符串,并返回一个包含这些子字符串的列表。如果不指定分隔符,默认会以空白字符(空格、制表符、换行符等)作为分隔符进行分割。

  3. reversed函数

    reversed函数主要用于将可迭代对象(如列表、元组、字符串等)中的元素顺序进行反转,并返回一个可迭代的反向迭代器对象。需要注意的是,它并不会改变原可迭代对象本身的顺序,只是提供了一种反向遍历元素的方式。

  4. enumerate函数

    enumerate函数用于将一个可迭代对象(如列表、元组、字符串等)组合为一个包含索引和对应元素的枚举对象。简单来说,它可以在遍历可迭代对象时,同时获取每个元素的索引值(默认从 0 开始)以及该元素本身,这在很多需要知道元素位置信息的场景中非常方便。

其中 reversed 就是我前面说的为了添加千分位逗号 需要从低位往高位进行读取

而 enumerate 函数是为了能在循环中获取到相应的索引和元素。

个人解答

def solution(s: str) -> str:
    # 去除前导零
    s = s.lstrip('0')
    if s == '':
        s = '0'
​
    # 分离整数部分和小数部分
    if '.' in s:
        integer_part, fractional_part = s.split('.')
    else:
        integer_part, fractional_part = s, ''
​
    # 在整数部分插入逗号
    integer_part_with_commas = ''
    for i, char in enumerate(reversed(integer_part)):
        if i > 0 and i % 3 == 0:
            integer_part_with_commas = ',' + integer_part_with_commas
        integer_part_with_commas = char + integer_part_with_commas
​
    # 合并整数部分和小数部分
    result = integer_part_with_commas
    if fractional_part:
        result += '.' + fractional_part
​
    return result
​
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')