数字字符串格式化 | 豆包MarsCode AI刷题

65 阅读4分钟

文章标题:

在日常编程中,处理用户输入并进行格式化是一个常见的需求。尤其是在涉及到金融数据或者大数字的显示时,我们经常需要将数字以“千分位”格式展示,以增强可读性。除此之外,用户输入的数字可能会包含不必要的前导零,这也需要去除。在这篇文章中,我们将讨论如何通过 Java 编程实现这两个功能:将数字字符串转化为带千分位逗号的格式,并去除多余的前导零。

问题分析

假设我们收到一个数字字符串,可能包含以下几种情况:

  1. 无千分位格式:例如 "1294512.12412",需要将其转化为带有千分位逗号的格式:"1,294,512.12412"
  2. 前导零问题:例如 "0000123456789.99",需要去除前导零,并转化为 "123,456,789.99"
  3. 无小数部分:例如 "987654321",需要格式化为 "987,654,321"

我们要做的工作是:

  • 去除数字字符串中整数部分的前导零。
  • 将整数部分进行千分位格式化。
  • 如果存在小数部分,保持其不变并将格式化后的整数部分与小数部分连接。

解题思路

  1. 拆分整数和小数部分:我们可以使用 split(".") 将输入字符串分割成整数部分和小数部分。对于没有小数部分的数字,只需要处理整数部分。
  2. 去除前导零:可以通过正则表达式 ^0+ 来去除整数部分的前导零。如果整数部分全部是零(例如 "0000"),我们需要将其设置为 "0"
  3. 千分位格式化:Java 提供了 DecimalFormat 类,可以方便地将数字格式化为千分位格式。使用模式 #,### 就可以达到这个目的。
  4. 重构输出字符串:最后,将格式化后的整数部分与小数部分(如果有)连接起来,生成最终的格式化数字字符串。

代码实现

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"));
    }
}

代码解析

  1. 分割整数和小数部分

    • 使用 split("\.") 将输入字符串分割成两个部分:整数部分和小数部分。通过正则表达式 \. 来匹配小数点。
    javaCopy Code
    String[] parts = s.split("\.");
    
  2. 去除整数部分的前导零

    • 对整数部分使用正则表达式 ^0+ 来移除多余的前导零。^0+ 匹配从字符串开头起的一个或多个零。
    javaCopy Code
    String integerPart = parts[0].replaceFirst("^0+", "");
    
    • 如果整数部分全是零(即 integerPart.isEmpty()),则将其赋值为 "0"
    javaCopy Code
    if (integerPart.isEmpty()) {
        integerPart = "0";
    }
    
  3. 千分位格式化

    • 使用 DecimalFormat 类来格式化整数部分。#,### 模式会根据数字自动添加千分位逗号。
    javaCopy Code
    DecimalFormat df = new DecimalFormat("#,###");
    String formattedIntegerPart = df.format(Long.parseLong(integerPart));
    
  4. 合并整数和小数部分

    • 如果输入字符串包含小数部分,我们将格式化后的整数部分和原始的小数部分通过小数点连接返回。
    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"

复杂度分析

  1. 时间复杂度

    • 字符串分割操作是 O(n),其中 n 是输入字符串的长度。
    • replaceFirst 操作是 O(m),其中 m 是整数部分的长度。
    • DecimalFormat.format 的时间复杂度是 O(k),其中 k 是整数部分的长度。
    • 整体时间复杂度是 O(n),因为 n 是字符串的最大长度。
  2. 空间复杂度

    • 使用了几个临时字符串,因此空间复杂度为 O(n),其中 n 是输入字符串的长度。

总结

通过这篇文章,我们展示了如何使用 Java 来处理数字字符串的格式化需求。我们解决了两个常见问题:去除前导零和添加千分位逗号,并且保留了小数部分。通过 DecimalFormat 类,我们可以高效地对数字进行格式化,并且通过正则表达式去除不必要的前导零。最终,我们可以根据用户输入的字符串生成符合要求的格式化数字字符串。