问题描述
小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。
解题思路
- 去除前导零:首先,我们需要去除字符串前面的无用零。可以使用
String.replaceFirst("^0+(?!$)", "")来去除前导零。 - 分割整数和小数部分:将字符串分割成整数部分和小数部分。可以使用
String.split("\.")来实现。 - 格式化整数部分:对整数部分进行千分位格式化。可以使用
StringBuilder来逐步插入逗号。 - 合并结果:将格式化后的整数部分和小数* * *
测试样例
样例1:
输入:
s = "1294512.12412"
输出:'1,294,512.12412'
样例2:
输入:
s = "0000123456789.99"
输出:'123,456,789.99'
样例3:
输入:
s = "987654321"
输出:'987,654,321'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 formattedInteger = new StringBuilder();
for (int i = 0; i < integerPart.length(); i++) {
if (i > 0 && (integerPart.length() - i) % 3 == 0) {
formattedInteger.append(",");
}
formattedInteger.append(integerPart.charAt(i));
}
// 合并结果
return formattedInteger.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"));
}
}### 关键步骤解释
- 去除前导零:
s.replaceFirst("^0+(?!$)", "")使用正则表达式去除字符串前面的所有零。 - 分割整数和小数部分:
s.split("\.")将字符串按小数点分割成整数部分和小数部分。 - 格式化整数部分:使用
StringBuilder逐步插入逗号,确保每三位插入一个逗号。 - 合并结果:将格式化后的整数部分和小数部分合并成最终结果。
解题思路
- 去除前导零:首先,我们需要去除字符串前面的无用零。可以使用
String.replaceFirst("^0+(?!$)", "")来去除前导零。 - 分割整数和小数部分:将字符串分割成整数部分和小数部分。可以使用
String.split("\.")来实现。 - 格式化整数部分:对整数部分进行千分位格式化。可以使用
StringBuilder来逐步插入逗号。 - 合并结果:将格式化后的整数部分和小数部分合并成最终结果。
详细步骤
-
去除前导零:
- 使用正则表达式
^0+(?!$)匹配字符串开头的所有零,并将其替换为空字符串。 ^表示字符串的开头,0+表示一个或多个零,(?!$)是一个负向前瞻,确保匹配的零不是字符串的结尾。
- 使用正则表达式
-
分割整数和小数部分:
- 使用
String.split("\.")将字符串按小数点分割成整数部分和小数部分。 - 如果字符串中没有小数点,则小数部分为空字符串。
- 使用
-
格式化整数部分:
- 使用
StringBuilder逐步构建格式化后的整数部分。 - 从整数部分的末尾开始,每三位插入一个逗号。
- 使用
-
合并结果:
- 将格式化后的整数部分和小数部分合并
关键步骤解释
- 去除前导零:
s.replaceFirst("^0+(?!$)", "")使用正则表达式去除字符串前面的所有零。 - 分割整数和小数部分:
s.split("\.")将字符串按小数点分割成整数部分和小数部分。 - 格式化整数部分:使用
StringBuilder逐步插入逗号,确保每三位插入一个逗号。 - 合并结果:将格式化后的整数部分和小数部分合并成最终结果。 如何处理输入字符串中没有小数点的情况?
解题思路
-
去除前导零:首先,我们需要去除字符串前面的无用零。可以使用
String.replaceFirst("^0+(?!$)", "")来去除前导零。 -
分割整数和小数部分:将字符串分割成整数部分和小数部分。可以使用
String.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 formattedInteger = new StringBuilder(); for (int i = 0; i < integerPart.length(); i++) { if (i > 0 && (integerPart.length() - i) % 3 == 0) { formattedInteger.append(","); } formattedInteger.append(integerPart.charAt(i)); } // 合并结果 return formattedInteger.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")); } }