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

30 阅读3分钟

代码: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, ''

# 格式化整数部分
formatted_integer = ''
for i, char in enumerate(reversed(integer_part)):
if i > 0 and i % 3 == 0:
formatted_integer = ',' + formatted_integer
formatted_integer = char + formatted_integer

# 合并结果
if fractional_part:
return f"{formatted_integer}.{fractional_part}"
else:
return formatted_integer

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') 思路分析:小M的问题主要是将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分,同时需要去除前导零。这个问题可以分为几个步骤来解决。 1. 去除前导零
首先,考虑到输入的数字字符串可能包含前导零,这些前导零在最终的格式中是不需要的。因此,第一步是去除这些前导零。这里使用了字符串的lstrip方法,它可以去除字符串开头的指定字符,在这个例子中是指定去除 '0'。去除前导零后,有一个特殊情况需要考虑,即当整个字符串都是 '0' 时,去除前导零后会变成一个空字符串。在这种情况下,我们需要将其恢复为 '0',以保持数字的合法性。 2. 分离整数和小数部分
接下来,我们需要将数字字符串分为整数部分和小数部分。这一步是为了后续单独对整数部分进行千分位格式化处理,同时保留小数部分不变。 这里使用了字符串的split方法,以 '.' 为分隔符将字符串分割为两部分。如果字符串中包含 '.',则分割为整数部分和小数部分;如果不包含 '.',则整数部分为整个字符串,小数部分为空字符串。
3. 格式化整数部分
我们需要对整数部分进行千分位格式化处理。千分位格式化的规则是,从右往左数,每三位数字前插入一个逗号。 这里使用了一个循环来遍历整数部分的每一个字符,但是是从右往左遍历(通过reversed函数实现)。在遍历过程中,我们使用enumerate函数来获取每个字符的索引i和字符char。 在每次循环中,我们检查索引i是否大于 0 且是 3 的倍数(注意这里的索引是从 0 开始的,所以实际上是每三个字符插入一个逗号)。如果是,则在当前结果字符串formatted_integer前面插入一个逗号。然后,将当前字符char添加到结果字符串的前面。这样,循环结束后,我们就得到了格式化后的整数部分。
4. 合并结果
最后一步是将格式化后的整数部分和小数部分合并起来,形成最终的带千分位逗号的数字字符串。这里使用了一个简单的条件判断,如果小数部分存在(即非空字符串),则将格式化后的整数部分和小数部分通过 '.' 连接起来;如果小数部分不存在,则直接返回格式化后的整数部分。
综上所述,这段代码通过以下几个步骤实现了将不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且去除了前导零、保留了小数部分:

  1. 去除前导零,并处理特殊情况(整个字符串为 '0')。

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

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

  4. 合并格式化后的整数部分和小数部分,形成最终结果。

每一步都考虑到了可能的特殊情况,并进行了相应的处理,确保了代码的健壮性和正确性。