数字字符串格式化

126 阅读2分钟

问题描述 小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' 好的,让我们来分析一下这个问题,并给出一些解题思路。

问题理解

我们需要将一个不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。同时,如果输入的数字字符串前面有无效的 0,这些 0 也需要被去掉。

数据结构选择

由于我们处理的是字符串,并且需要对字符串进行插入操作(插入逗号),使用字符串或字符串构建器(StringBuilder)是比较合适的选择。

算法步骤

  1. 去除前导零:首先,我们需要去掉字符串前面的无效 0
  2. 分离整数部分和小数部分:将字符串分为整数部分和小数部分(如果有小数点)。
  3. 处理整数部分:对整数部分从右向左每三位插入一个逗号。
  4. 合并结果:将处理后的整数部分和小数部分(如果有)合并成最终结果。

代码框架

我们可以根据上述思路来构建代码框架。以下是一个初步的代码框架:

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();
        for (int i = 0; i < integerPart.length(); i++) {
            if (i > 0 && i % 3 == 0) {
                formattedIntegerPart.append(",");
            }
            formattedIntegerPart.append(integerPart.charAt(integerPart.length() - 1 - i));
        }
        formattedIntegerPart.reverse();
        
        // 合并结果
        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"));
    }
}

关键步骤

  • 去除前导零:使用 replaceFirst 方法去除字符串前面的无效 0
  • 分离整数部分和小数部分:使用 split 方法将字符串分为整数部分和小数部分。
  • 处理整数部分:使用 StringBuilder 从右向左每三位插入一个逗号,然后反转字符串。
  • 合并结果:将处理后的整数部分和小数部分合并成最终结果。

以下是完整的代码实现,包含了去除前导零、分离整数部分和小数部分、处理整数部分并插入逗号、以及合并结果的逻辑。 java 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        ();        for (int i = 0; i <         integerPart.length        (); i++) {            if (i > 0 && i             % 3 == 0) {                formattedInt                egerPart.                append(",");            }            formattedInteger            Part.append            (integerPart.            charAt            (integerPart.            length() - 1 -             i));        }        formattedIntegerPart        .reverse();                // 合并结果        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"));    }} 代码解释去除前导零:使用 replaceFirst("^0+(?!)", "") 去除字符串前面的无效 0。分离整数部分和小数部分:使用 split("\.") 将字符串分为整数部分和小数部分。处理整数部分:使用 StringBuilder 从右向左每三位插入一个逗号,然后反转字符串。合并结果:将处理后的整数部分和小数部分合并成最终结果。