问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
测试样例
样例1:
输入:
s = "1294512.12412"
输出:'1,294,512.12412'
样例2:
输入:
s = "0000123456789.99"
输出:'123,456,789.99'
样例3:
输入:
s = "987654321"
输出:'987,654,321'
思路
好的,让我们来检查一下你当前编辑区的代码。
当前代码
def solution(s: str) -> str:
s = s.strip('0')
float_part = None
if '.' in s:
for i in range(len(s)):
if s[i] == '.':
break
float_part = s[i:]
decimal_part = s[:i]
else:
decimal_part = s
remainder = len(decimal_part) % 3
result = ''
if len(decimal_part) <= 3:
result = decimal_part
else:
for i in range(len(decimal_part)):
result += decimal_part[i]
if i == remainder - 1 or (i - remainder + 1) % 3 == 0 and i != len(decimal_part) -1:
result += ','
if float_part:
result += float_part
return result
检查结果
-
去除前导零:
s.strip('0')只会去除字符串两端的0,而不会去除中间的0。例如,"0000123456789.99"会被处理成"123456789.99",而不是"123,456,789.99"。- 建议使用正则表达式来去除前导零:
s = re.sub(r'^0+(?=\d)', '', s)。
-
分离整数部分和小数部分:
- 代码逻辑基本正确,但可以简化。可以直接使用
s.split('.')来分离整数部分和小数部分。
- 代码逻辑基本正确,但可以简化。可以直接使用
-
处理整数部分:
- 代码逻辑有些复杂,可以简化。可以使用
reversed和join来更高效地插入逗号。
- 代码逻辑有些复杂,可以简化。可以使用
-
合并整数部分和小数部分:
- 代码逻辑基本正确,但可以简化。
建议
以下是改进后的代码:
import re
def solution(s: str) -> str:
# 去除前导零
s = re.sub(r'^0+(?=\d)', '', s)
# 分离整数部分和小数部分
if '.' in s:
integer_part, float_part = s.split('.')
float_part = '.' + float_part
else:
integer_part, float_part = s, ''
# 处理整数部分
if len(integer_part) <= 3:
result = integer_part
else:
result = ''
for i, char in enumerate(reversed(integer_part)):
if i > 0 and i % 3 == 0:
result = ',' + result
result = char + result
# 合并整数部分和小数部分
return result + float_part
# 测试用例
print(solution("1294512.12412")) # 输出: '1,294,512.12412'
print(solution("0000123456789.99")) # 输出: '123,456,789.99'
print(solution("987654321")) # 输出: '987,654,321'
详细步骤
-
去除前导零:
s = re.sub(r'^0+(?=\d)', '', s)这行代码使用正则表达式去除字符串前面的无用
0。 -
分离整数部分和小数部分:
if '.' in s: integer_part, float_part = s.split('.') float_part = '.' + float_part else: integer_part, float_part = s, ''这行代码将字符串分为整数部分和小数部分。如果字符串中没有小数点,
float_part将为空字符串。 -
处理整数部分:
if len(integer_part) <= 3: result = integer_part else: result = '' for i, char in enumerate(reversed(integer_part)): if i > 0 and i % 3 == 0: result = ',' + result result = char + result这段代码从后往前每三位插入一个逗号。
-
合并整数部分和小数部分:
return result + float_part这行代码将处理后的整数部分和小数部分合并成最终的结果。
希望这些改进对你有所帮助!如果你有任何具体的问题或需要进一步的代码提示,请告诉我。
python题解
def solution(s: str) -> str:
s = s.strip('0')
float_part = None
if '.' in s:
for i in range(len(s)):
if s[i] == '.':
break
float_part = s[i:]
decimal_part = s[:i]
else:
decimal_part = s
remainder = len(decimal_part) % 3
result = ''
if len(decimal_part) <= 3:
result = decimal_part
else:
for i in range(len(decimal_part)):
result += decimal_part[i]
if i == remainder - 1 or (i - remainder + 1) % 3 == 0 and i != len(decimal_part) -1:
result += ','
if float_part:
result += float_part
return result