当前位置: 首页 > article >正文

数字字符串格式化

小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. 输出格式:输出是一个带千分位逗号的数字字符串,保留小数部分,并且去掉前面的无用 0

解题思路

  1. 去除前导零:首先需要去掉字符串前面的无用 0。可以使用 strip 方法去掉前导零。
  2. 分离整数和小数部分:将字符串分为整数部分和小数部分。可以使用 split 方法根据小数点进行分割。
  3. 处理整数部分:对整数部分进行千分位逗号的插入。可以从后往前每三位插入一个逗号。
  4. 合并结果:将处理后的整数部分和小数部分重新合并。

Python代码

def solution(s: str) -> str:
    # 去掉前导零
    s = s.lstrip('0')
    if s == '':
        s = '0'
    
    # 分离整数和小数部分
    if '.' in s:
        integer_part, decimal_part = s.split('.')
    else:
        integer_part, decimal_part = s, ''
    
    # 处理整数部分
    if len(integer_part) > 3:
        # 从后往前每三位插入一个逗号
        integer_part = ','.join([integer_part[max(i-3, 0):i] for i in range(len(integer_part), 0, -3)][::-1])
    
    # 合并结果
    if decimal_part:
        return f"{integer_part}.{decimal_part}"
    else:
        return integer_part

if __name__ == '__main__':
    print(solution("1294512.12412") )
    print(solution("0000123456789.99") )
    print(solution("987654321"))

C#代码

using System;
using System.Text;

class Program
{
    static string Solution(string s)
    {
        // 去掉前导零
        s = s.TrimStart('0');
        if (s == "")
        {
            s = "0";
        }

        // 分离整数和小数部分
        string integerPart, decimalPart;
        if (s.Contains('.'))
        {
            string[] parts = s.Split('.');
            integerPart = parts[0];
            decimalPart = parts[1];
        }
        else
        {
            integerPart = s;
            decimalPart = "";
        }

        // 处理整数部分
        if (integerPart.Length > 3)
        {
            StringBuilder sb = new StringBuilder();
            int count = 0;
            for (int i = integerPart.Length - 1; i >= 0; i--)
            {
                sb.Insert(0, integerPart[i]);
                count++;
                if (count % 3 == 0 && i != 0)
                {
                    sb.Insert(0, ',');
                }
            }
            integerPart = sb.ToString();
        }

        // 合并结果
        if (decimalPart != "")
        {
            return $"{integerPart}.{decimalPart}";
        }
        else
        {
            return integerPart;
        }
    }

    static void Main(string[] args)
    {
        Console.WriteLine(Solution("1294512.12412") );
        Console.WriteLine(Solution("0000123456789.99") );
        Console.WriteLine(Solution("987654321"));
    }
}

 

这个题目主要考察以下几个编程和字符串处理方面的知识点:

1. 字符串操作

  • 去除前导零:使用 lstrip('0') 方法去除字符串前面的无用 0
  • 分割字符串:使用 split('.') 方法将字符串分割为整数部分和小数部分。
  • 插入字符:在字符串中插入逗号,实现千分位格式化。

2. 列表推导式

  • 逆序处理:使用列表推导式从后往前每三位插入一个逗号,然后逆序合并。

3. 条件判断

  • 处理特殊情况:如输入字符串为空或全为 0 的情况。
  • 合并结果:根据是否有小数部分,选择合适的格式返回结果。

4. 字符串格式化

  • 格式化输出:使用 f-string 或 format 方法将整数部分和小数部分合并成最终结果。

5. 边界条件处理

  • 处理边界情况:如输入字符串为 "0" 或 "0000" 等特殊情况。

总结

这个题目通过字符串操作、列表推导式、条件判断和字符串格式化等知识点,考察了编程者对字符串处理和逻辑思维的能力。通过解决这个问题,可以加深对这些知识点的理解和应用。


http://www.kler.cn/a/393315.html

相关文章:

  • C语言 | Leetcode C语言题解之第556题下一个更大元素III
  • TortoiseSVN提示服务器凭证检核错误:站点名称不符
  • kafka面试题解答(四)
  • JWT深度解析:Java Web中的安全传输与身份验证
  • C++面试基础知识:排序算法 C++实现
  • qt QProcess详解
  • 【Rust调用Windows API】杀掉指定进程(包括兄弟进程、子进程、父进程)
  • 人力资源招聘系统-提升招聘效率与质量的关键工具
  • Docker 部署Nacos 单机部署 MYSQL数据持久化
  • 计算机网络(4)之交换技术,分层技术和默认网关
  • 怎么在MindMaster里插入剪贴画?
  • c++ 二分查找
  • Mac Nginx 前端打包部署
  • Vue开发风格
  • Scala的Map集合练习
  • 关键字“退出、结束、跳过”(day13)
  • 2024 年 10 月区块链游戏研报:活跃用户与链上游戏生态的最新趋势解读
  • 飞牛私有云访问外网
  • Python发展历程·练习题 --- 《跟着小王学Python》
  • Golang | Leetcode Golang题解之第553题最优除法
  • 使用 Python 和 OpenCV 实现摄像头人脸检测并截图
  • 什么是RabbitMQ?
  • 搭建Python2和Python3虚拟环境
  • MySQL --- 自定义函数获取部门层级名称
  • 修改mysql默认字符集
  • C语言最简单的扫雷实现(解析加原码)