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

81 阅读3分钟

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

在编程的世界里,处理字符串的格式化问题是非常常见的任务。今天,我们来探讨一个具体的题目:小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程序,完成这个任务。

问题描述

小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'

解题思路

字符串处理与格式化

在这个问题中,我们需要处理以下几个步骤:

  1. 处理负号:如果输入的字符串以负号 - 开头,我们需要先记录这个负号,然后去掉它,以便后续处理。
  2. 分割整数和小数部分:使用 split 方法将字符串按小数点分割成整数部分和小数部分。
  3. 去除前导零:去除整数部分的前导零。
  4. 添加千分位逗号:在整数部分中,从右向左每三位添加一个逗号。
  5. 组合结果:将处理后的整数部分和小数部分重新组合成最终的字符串,并在必要时加上负号。

代码实现

java

复制代码

public class Main {
    public static String solution(String s) {
        boolean isNegative = false;
        if (s.startsWith("-")) {
            isNegative = true;
            s = s.substring(1);
        }

        String[] parts = s.split("\.");
        String integerPart = parts[0].replaceFirst("^0+", "");
        StringBuilder formattedIntegerPart = new StringBuilder();
        int integerLength = integerPart.length();

        for (int i = 0; i < integerLength; i++) {
            if ((integerLength - i) % 3 == 0 && i > 0) {
                formattedIntegerPart.append(',');
            }
            formattedIntegerPart.append(integerPart.charAt(i));
        }

        String decimalPart = parts.length > 1 ? "." + parts[1] : "";
        String result = formattedIntegerPart.toString() + decimalPart;

        return isNegative ? "-" + result : result;
    }

    public static void main(String[] args) {
        System.out.println(solution("1294512.12412").equals("1,294,512.12412")); // 输出: true
        System.out.println(solution("0000123456789.99").equals("123,456,789.99")); // 输出: true
        System.out.println(solution("987654321").equals("987,654,321")); // 输出: true
    }
}

代码解析

  • solution 方法

    • 处理负号:如果输入的字符串以负号 - 开头,记录 isNegative 为 true,并去掉负号。
    • 分割整数和小数部分:使用 split 方法将字符串按小数点分割成整数部分和小数部分。
    • 去除前导零:使用 replaceFirst 方法去除整数部分的前导零。
    • 添加千分位逗号:使用 StringBuilder 构建新的整数部分,从右向左每三位添加一个逗号。
    • 组合结果:将处理后的整数部分和小数部分重新组合成最终的字符串,并在必要时加上负号。
    • 返回结果:返回格式化后的字符串。
  • main 方法

    • 测试了三个样例,验证了 solution 方法的正确性。

时间和空间复杂度分析

  • 时间复杂度:O(n),其中 n 是输入字符串的长度。我们只需要遍历字符串一次。
  • 空间复杂度:O(n),我们使用了 StringBuilder 来构建新的字符串,空间复杂度与输入字符串的长度成正比。

总结

通过处理字符串的前导零和添加千分位逗号,我们能够高效地完成数字字符串的格式化任务。这种方法不仅简洁,而且在实际应用中也非常实用。希望这篇文章能帮助你更好地理解和掌握这一技巧。如果你有任何问题或建议,欢迎在评论区留言讨论!