最佳人选
问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
分析题目
题目要求我们将一个不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。此外,输入的数字字符串前面可能会有无用的 0,这些 0 需要被精简掉。
测试样例
样例1:
输入:
s = "1294512.12412"
输出:'1,294,512.12412'
样例2:
输入:
s = "0000123456789.99"
输出:'123,456,789.99'
样例3:
输入:
s = "987654321"
输出:'987,654,321'
数据结构选择
- 字符串:由于我们需要处理字符串的格式化,字符串是最直接的数据结构。
- StringBuilder:在处理字符串拼接时,
StringBuilder比直接使用字符串拼接更高效。
算法设计
- 去除前导零:使用正则表达式去除字符串前面的无用
0。 - 分割整数和小数部分:使用
split方法将字符串分割为整数部分和小数部分。 - 格式化整数部分:从后往前遍历整数部分,每三位插入一个逗号。
- 拼接结果:将格式化后的整数部分和小数部分拼接起来。
具体步骤
-
去除前导零:
- 使用正则表达式
^0+(?!$)匹配字符串开头的0,并将其替换为空字符串。
- 使用正则表达式
-
分割整数和小数部分:
- 使用
split("\.")方法将字符串分割为整数部分和小数部分。
- 使用
-
格式化整数部分:
- 使用
StringBuilder从后往前遍历整数部分,每三位插入一个逗号。
- 使用
-
拼接结果:
- 将格式化后的整数部分和小数部分拼接起来,返回结果。
代码展示
public class Main {
public static String solution(String s) {
// 去除前导零
s = s.replaceFirst("^0+(?!$)", "");
String[] parts = s.split("\\.");
String integerPart = parts[0];
String decimalPart = parts.length > 1 ? "." + parts[1] : "";
// 格式化整数部分
StringBuilder formattedIntegerPart = new StringBuilder();
int len = integerPart.length();
for (int i = 0; i < len; i++) {
if (i > 0 && (len - i) % 3 == 0) {
formattedIntegerPart.append(",");
}
formattedIntegerPart.append(integerPart.charAt(i));
}
// 拼接结果
return formattedIntegerPart.toString() + decimalPart;
}
public static void main(String[] args) {
System.out.println(solution("1294512.12412").equals("1,294,512.12412"));
System.out.println(solution("0000123456789.99").equals("123,456,789.99"));
System.out.println(solution("987654321").equals("987,654,321"));
}
‘
优化设计
-
去除前导零:
- 使用
Long.parseLong方法将整数部分转换为long类型,这样可以自动去除前导零。
- 使用
-
分割整数和小数部分:
- 使用
indexOf(".")方法找到小数点的位置,然后分别处理整数部分和小数部分。
- 使用
-
格式化整数部分:
- 使用
String.format方法格式化整数部分,这样可以自动插入千分位逗号。
- 使用
-
拼接结果:
- 直接使用
+运算符拼接整数部分和小数部分。
- 直接使用
知识点总结
-
字符串处理:
- 字符串分割:使用
split方法将字符串分割为整数部分和小数部分。 - 字符串拼接:使用
StringBuilder或+运算符拼接字符串。 - 字符串替换:使用
replaceFirst方法去除字符串前面的无用0。
- 字符串分割:使用
-
正则表达式:
- 正则匹配:使用正则表达式
^0+(?!$)匹配字符串开头的0,并将其替换为空字符串。
- 正则匹配:使用正则表达式
-
数据结构:
- StringBuilder:在处理字符串拼接时,
StringBuilder比直接使用字符串拼接更高效。
- StringBuilder:在处理字符串拼接时,
-
格式化输出:
- 格式化整数:使用
String.format方法格式化整数部分,自动插入千分位逗号。
- 格式化整数:使用