文章标题:
在日常编程中,处理用户输入并进行格式化是一个常见的需求。尤其是在涉及到金融数据或者大数字的显示时,我们经常需要将数字以“千分位”格式展示,以增强可读性。除此之外,用户输入的数字可能会包含不必要的前导零,这也需要去除。在这篇文章中,我们将讨论如何通过 Java 编程实现这两个功能:将数字字符串转化为带千分位逗号的格式,并去除多余的前导零。
问题分析
假设我们收到一个数字字符串,可能包含以下几种情况:
- 无千分位格式:例如
"1294512.12412",需要将其转化为带有千分位逗号的格式:"1,294,512.12412"。 - 前导零问题:例如
"0000123456789.99",需要去除前导零,并转化为"123,456,789.99"。 - 无小数部分:例如
"987654321",需要格式化为"987,654,321"。
我们要做的工作是:
- 去除数字字符串中整数部分的前导零。
- 将整数部分进行千分位格式化。
- 如果存在小数部分,保持其不变并将格式化后的整数部分与小数部分连接。
解题思路
- 拆分整数和小数部分:我们可以使用
split(".")将输入字符串分割成整数部分和小数部分。对于没有小数部分的数字,只需要处理整数部分。 - 去除前导零:可以通过正则表达式
^0+来去除整数部分的前导零。如果整数部分全部是零(例如"0000"),我们需要将其设置为"0"。 - 千分位格式化:Java 提供了
DecimalFormat类,可以方便地将数字格式化为千分位格式。使用模式#,###就可以达到这个目的。 - 重构输出字符串:最后,将格式化后的整数部分与小数部分(如果有)连接起来,生成最终的格式化数字字符串。
代码实现
javaCopy Code
import java.text.DecimalFormat;
public class Main {
public static String solution(String s) {
// 先处理小数点前后的部分
String[] parts = s.split("\.");
// 处理整数部分,去掉前导零
String integerPart = parts[0].replaceFirst("^0+", "");
// 如果整数部分为空,说明原字符串全是零,设置为"0"
if (integerPart.isEmpty()) {
integerPart = "0";
}
// 千分位格式化
DecimalFormat df = new DecimalFormat("#,###");
String formattedIntegerPart = df.format(Long.parseLong(integerPart));
// 如果有小数部分,保留小数部分
if (parts.length > 1) {
return formattedIntegerPart + "." + parts[1];
} else {
return formattedIntegerPart;
}
}
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"));
}
}
代码解析
-
分割整数和小数部分:
- 使用
split("\.")将输入字符串分割成两个部分:整数部分和小数部分。通过正则表达式\.来匹配小数点。
javaCopy Code String[] parts = s.split("\."); - 使用
-
去除整数部分的前导零:
- 对整数部分使用正则表达式
^0+来移除多余的前导零。^0+匹配从字符串开头起的一个或多个零。
javaCopy Code String integerPart = parts[0].replaceFirst("^0+", "");- 如果整数部分全是零(即
integerPart.isEmpty()),则将其赋值为"0"。
javaCopy Code if (integerPart.isEmpty()) { integerPart = "0"; } - 对整数部分使用正则表达式
-
千分位格式化:
- 使用
DecimalFormat类来格式化整数部分。#,###模式会根据数字自动添加千分位逗号。
javaCopy Code DecimalFormat df = new DecimalFormat("#,###"); String formattedIntegerPart = df.format(Long.parseLong(integerPart)); - 使用
-
合并整数和小数部分:
- 如果输入字符串包含小数部分,我们将格式化后的整数部分和原始的小数部分通过小数点连接返回。
javaCopy Code if (parts.length > 1) { return formattedIntegerPart + "." + parts[1]; }
测试用例
-
输入 1:
"1294512.12412"- 输出:
"1,294,512.12412"
- 输出:
-
输入 2:
"0000123456789.99"- 输出:
"123,456,789.99"
- 输出:
-
输入 3:
"987654321"- 输出:
"987,654,321"
- 输出:
复杂度分析
-
时间复杂度:
- 字符串分割操作是 O(n),其中 n 是输入字符串的长度。
replaceFirst操作是 O(m),其中 m 是整数部分的长度。DecimalFormat.format的时间复杂度是 O(k),其中 k 是整数部分的长度。- 整体时间复杂度是 O(n),因为
n是字符串的最大长度。
-
空间复杂度:
- 使用了几个临时字符串,因此空间复杂度为 O(n),其中 n 是输入字符串的长度。
总结
通过这篇文章,我们展示了如何使用 Java 来处理数字字符串的格式化需求。我们解决了两个常见问题:去除前导零和添加千分位逗号,并且保留了小数部分。通过 DecimalFormat 类,我们可以高效地对数字进行格式化,并且通过正则表达式去除不必要的前导零。最终,我们可以根据用户输入的字符串生成符合要求的格式化数字字符串。