数字字符串格式化
小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'
问题理解
- 输入格式:输入是一个不带千分位逗号的数字字符串,可能包含小数部分,也可能不包含。
- 输出格式:输出是一个带千分位逗号的数字字符串,保留小数部分,并且去掉前面的无用
0
。
解题思路
- 去除前导零:首先需要去掉字符串前面的无用
0
。可以使用strip
方法去掉前导零。 - 分离整数和小数部分:将字符串分为整数部分和小数部分。可以使用
split
方法根据小数点进行分割。 - 处理整数部分:对整数部分进行千分位逗号的插入。可以从后往前每三位插入一个逗号。
- 合并结果:将处理后的整数部分和小数部分重新合并。
Python代码
def solution(s: str) -> str:
# 去掉前导零
s = s.lstrip('0')
if s == '':
s = '0'
# 分离整数和小数部分
if '.' in s:
integer_part, decimal_part = s.split('.')
else:
integer_part, decimal_part = s, ''
# 处理整数部分
if len(integer_part) > 3:
# 从后往前每三位插入一个逗号
integer_part = ','.join([integer_part[max(i-3, 0):i] for i in range(len(integer_part), 0, -3)][::-1])
# 合并结果
if decimal_part:
return f"{integer_part}.{decimal_part}"
else:
return integer_part
if __name__ == '__main__':
print(solution("1294512.12412") )
print(solution("0000123456789.99") )
print(solution("987654321"))
C#代码
using System;
using System.Text;
class Program
{
static string Solution(string s)
{
// 去掉前导零
s = s.TrimStart('0');
if (s == "")
{
s = "0";
}
// 分离整数和小数部分
string integerPart, decimalPart;
if (s.Contains('.'))
{
string[] parts = s.Split('.');
integerPart = parts[0];
decimalPart = parts[1];
}
else
{
integerPart = s;
decimalPart = "";
}
// 处理整数部分
if (integerPart.Length > 3)
{
StringBuilder sb = new StringBuilder();
int count = 0;
for (int i = integerPart.Length - 1; i >= 0; i--)
{
sb.Insert(0, integerPart[i]);
count++;
if (count % 3 == 0 && i != 0)
{
sb.Insert(0, ',');
}
}
integerPart = sb.ToString();
}
// 合并结果
if (decimalPart != "")
{
return $"{integerPart}.{decimalPart}";
}
else
{
return integerPart;
}
}
static void Main(string[] args)
{
Console.WriteLine(Solution("1294512.12412") );
Console.WriteLine(Solution("0000123456789.99") );
Console.WriteLine(Solution("987654321"));
}
}
这个题目主要考察以下几个编程和字符串处理方面的知识点:
1. 字符串操作
- 去除前导零:使用
lstrip('0')
方法去除字符串前面的无用0
。 - 分割字符串:使用
split('.')
方法将字符串分割为整数部分和小数部分。 - 插入字符:在字符串中插入逗号,实现千分位格式化。
2. 列表推导式
- 逆序处理:使用列表推导式从后往前每三位插入一个逗号,然后逆序合并。
3. 条件判断
- 处理特殊情况:如输入字符串为空或全为
0
的情况。 - 合并结果:根据是否有小数部分,选择合适的格式返回结果。
4. 字符串格式化
- 格式化输出:使用
f-string
或format
方法将整数部分和小数部分合并成最终结果。
5. 边界条件处理
- 处理边界情况:如输入字符串为
"0"
或"0000"
等特殊情况。
总结
这个题目通过字符串操作、列表推导式、条件判断和字符串格式化等知识点,考察了编程者对字符串处理和逻辑思维的能力。通过解决这个问题,可以加深对这些知识点的理解和应用。