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

60 阅读3分钟

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

在日常工作中,数字字符串的格式化是一个常见的需求。小M在处理用户输入的数字字符串时遇到了一个问题:他需要将不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。此外,输入的数字字符串前面可能有无用的0,这些也需要精简掉。本文将探讨如何帮助小M编写程序,完成这个任务。

问题描述

小M需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。输入的数字字符串前面可能有无用的0,这些需要精简掉。目标是编写一个程序,将输入的数字字符串格式化为所需的格式。

解决方案

为了帮助小M完成这个任务,我们可以分以下几个步骤来实现:

  1. 去除前导0
    • 遍历字符串,找到第一个不为0的字符的位置,然后从该位置开始截取字符串。
  2. 分离整数部分和小数部分
    • 查找小数点的位置,将字符串分为整数部分和小数部分。
  3. 格式化整数部分
    • 从整数部分的末尾开始,每三个字符插入一个逗号,直到遍历完所有字符。
  4. 处理小数部分
    • 去除小数部分末尾的无用0。
  5. 组合结果
    • 将格式化后的整数部分和小数部分组合成最终的字符串。

代码实现

#include <string>
#include <iostream>
#include <bits/stdc++.h>
using namespace std;
std::string solution(const std::string& s) {
    size_t start = 0;
    while (start < s.size() && s[start] == '0') {
        start++;
    }
    string cleanedStr = s.substr(start);
    size_t dotPos = cleanedStr.find('.');
    string integerPart = (dotPos == string::npos) ? cleanedStr : cleanedStr.substr(0, dotPos);
    string decimalPart = (dotPos == string::npos) ? "" : cleanedStr.substr(dotPos);
    // 去除小数部分末尾的无用0
    while (decimalPart.size() > 1 && decimalPart.back() == '0') {
        decimalPart.pop_back();
    }
    string formattedIntegerPart;
    int count = 0;
    for (int i = integerPart.size() - 1; i >= 0; --i) {
        formattedIntegerPart = integerPart[i] + formattedIntegerPart;
        count++;
        if (count % 3 == 0 && i != 0) {
            formattedIntegerPart = ',' + formattedIntegerPart;
        }
    }
    return formattedIntegerPart + decimalPart;
}
int main() {
    // 测试样例
    std::cout << (solution("1294512.12412") == "1,294,512.12412") << std::endl;  // 输出:1
    std::cout << (solution("0000123456789.99") == "123,456,789.99") << std::endl;  // 输出:1
    std::cout << (solution("987654321") == "987,654,321") << std::endl;  // 输出:1
    return 0;
}

代码解释

  • 去除前导0:遍历字符串 s,找到第一个不为0的字符的位置 start,然后从该位置开始截取字符串 cleanedStr
  • 分离整数部分和小数部分:查找小数点的位置 dotPos,将字符串分为整数部分 integerPart 和小数部分 decimalPart
  • 处理小数部分:去除小数部分末尾的无用0。
  • 格式化整数部分:从整数部分的末尾开始,每三个字符插入一个逗号,直到遍历完所有字符。
  • 组合结果:将格式化后的整数部分和小数部分组合成最终的字符串 formattedIntegerPart + decimalPart

测试样例

  • 样例1s = "1294512.12412",输出:1,294,512.12412
  • 样例2s = "0000123456789.99",输出:123,456,789.99
  • 样例3s = "987654321",输出:987,654,321 通过上述方法,我们可以有效地帮助小M将用户输入的数字字符串格式化为带千分位逗号的格式,并且保留小数部分,同时去除前导0。