数字字符串格式化 - MarsCode
问题描述
小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.lstrip('0') # 去除字符串前面的 '0'if s == '':s = '0' # 如果去除前导零后字符串为空,则将其设置为 '0'# 分离整数和小数部分parts = s.split('.') # 将字符串按小数点分割为整数部分和小数部分int_s = parts[0] # 获取整数部分dec_s = parts[1] if len(parts) > 1 else "" # 获取小数部分,如果没有小数部分则设置为空字符串# 处理整数部分,插入千分位逗号reversed_part = int_s[::-1] # 将整数部分反转with_commas = ','.join(reversed_part[i:i+3] for i in range(0, len(reversed_part), 3)) # 每三位插入一个逗号int_s_with_commas = with_commas[::-1] # 将插入逗号后的字符串反转回来# 合并结果result = int_s_with_commas # 初始化结果为处理后的整数部分if dec_s:result += '.' + dec_s # 如果有小数部分,则将其添加到结果中return result # 返回最终结果if __name__ == '__main__':print(solution("1294512.12412") == '1,294,512.12412') # 测试用例1print(solution("0000123456789.99") == '123,456,789.99') # 测试用例2print(solution("987654321") == '987,654,321') # 测试用例3
详细注释
-
去除前导零:
s = s.lstrip('0') # 去除字符串前面的 '0'if s == '':s = '0' # 如果去除前导零后字符串为空,则将其设置为 '0'
s.lstrip('0')
:去除字符串s
前面的所有0
。if s == '': s = '0'
:如果去除前导零后字符串为空,则将其设置为'0'
。
-
分离整数和小数部分:
parts = s.split('.') # 将字符串按小数点分割为整数部分和小数部分int_s = parts[0] # 获取整数部分dec_s = parts[1] if len(parts) > 1 else "" # 获取小数部分,如果没有小数部分则设置为空字符串
s.split('.')
:将字符串s
按小数点分割为整数部分和小数部分。int_s = parts[0]
:获取整数部分。dec_s = parts[1] if len(parts) > 1 else ""
:获取小数部分,如果没有小数部分则设置为空字符串。
-
处理整数部分,插入千分位逗号:
reversed_part = int_s[::-1] # 将整数部分反转with_commas = ','.join(reversed_part[i:i+3] for i in range(0, len(reversed_part), 3)) # 每三位插入一个逗号int_s_with_commas = with_commas[::-1] # 将插入逗号后的字符串反转回来
int_s[::-1]
:将整数部分反转。','.join(reversed_part[i:i+3] for i in range(0, len(reversed_part), 3))
:每三位插入一个逗号。with_commas[::-1]
:将插入逗号后的字符串反转回来。
-
合并结果:
result = int_s_with_commas # 初始化结果为处理后的整数部分if dec_s:result += '.' + dec_s # 如果有小数部分,则将其添加到结果中return result # 返回最终结果
result = int_s_with_commas
:初始化结果为处理后的整数部分。if dec_s: result += '.' + dec_s
:如果有小数部分,则将其添加到结果中。return result
:返回最终结果。
def solution(s: str) -> str:# 去除前导零s = s.lstrip('0')if s == '':s = '0'# 分离整数和小数部分parts = s.split('.')integer_part = parts[0]decimal_part = parts[1] if len(parts) > 1 else ""# 处理整数部分,插入千分位逗号reversed_part = integer_part[::-1]with_commas = ','.join(reversed_part[i:i+3] for i in range(0, len(reversed_part), 3))integer_part_with_commas = with_commas[::-1]# 合并结果result = integer_part_with_commasif decimal_part:result += '.' + decimal_partreturn 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')