字节青训十五题-Java-数字字符串格式化
问题
问题描述
小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:- 如果字符串以多个
0开头(如"0000123.45"),需要去掉这些无效的0。 - 使用
BigDecimal是一个方便的方式,它可以自动处理数字的前置0,并保留小数部分。
- 如果字符串以多个
-
分离整数部分和小数部分:
- 用
split("\\.")方法将字符串按小数点分成整数部分和小数部分。 - 如果没有小数点(如
"123456"),则只需处理整数部分。
- 用
-
格式化整数部分:
- 从右往左遍历整数部分的字符,每隔 3 个字符插入一个逗号。
- 注意在第一个字符前不添加逗号。
-
重新组合结果:
- 如果存在小数部分,则将格式化后的整数部分与小数部分用小数点
.拼接。 - 如果没有小数部分,则直接返回格式化后的整数部分。
- 如果存在小数部分,则将格式化后的整数部分与小数部分用小数点

解释
输入示例 1:"1294512.12412"
-
去掉前导零:通过
BigDecimal处理字符串1294512.12412,去掉前导零后得到的是1294512.12412,无需变动。 -
转换为普通字符串:
number.toPlainString()将该数字转化为1294512.12412字符串。 -
分离整数和小数部分:通过
split("\\.")分割字符串,得到整数部分"1294512"和小数部分"12412"。 -
添加千分位逗号:
- 从右向左遍历整数部分
"1294512",每3位插入一个逗号:- 第一轮:
2→"2" - 第二轮:
1→"21" - 第三轮:
5→"521" - 第四轮:
4→"4521" - 第五轮:
9→"94521" - 第六轮:
2→"294521" - 第七轮:
1→"1294521"
- 第一轮:
- 结果为
"1,294,512"。
- 从右向左遍历整数部分
-
拼接整数和小数部分:最终的结果是
"1,294,512.12412"。
输出:1,294,512.12412
输入示例 2:"0000123456789.99"
-
去掉前导零:通过
BigDecimal处理字符串0000123456789.99,去掉前导零后得到123456789.99。 -
转换为普通字符串:
number.toPlainString()得到123456789.99字符串。 -
分离整数和小数部分:通过
split("\\.")分割字符串,得到整数部分"123456789"和小数部分"99"。 -
添加千分位逗号:
- 从右向左遍历整数部分
"123456789",每3位插入一个逗号:- 第一轮:
9→"9" - 第二轮:
8→"89" - 第三轮:
7→"789" - 第四轮:
6→"6789" - 第五轮:
5→"56789" - 第六轮:
4→"456789" - 第七轮:
3→"3456789" - 第八轮:
2→"23456789" - 第九轮:
1→"1,234,567,889"
- 第一轮:
- 结果为
"1,234,567,889"。
- 从右向左遍历整数部分
-
拼接整数和小数部分:最终的结果是
"1,234,567,889.99"。
输出:1,234,567,889.99
输入示例 3:"987654321"
-
去掉前导零:通过
BigDecimal处理字符串987654321,没有前导零,结果是987654321。 -
转换为普通字符串:
number.toPlainString()得到987654321字符串。 -
分离整数和小数部分:通过
split("\\.")分割字符串,得到整数部分"987654321"和小数部分""(没有小数部分)。 -
添加千分位逗号:
- 从右向左遍历整数部分
"987654321",每3位插入一个逗号:- 第一轮:
1→"1" - 第二轮:
2→"21" - 第三轮:
3→"321" - 第四轮:
4→"4321" - 第五轮:
5→"54321" - 第六轮:
6→"654321" - 第七轮:
7→"7654321" - 第八轮:
8→"87654321" - 第九轮:
9→"987654321"
- 第一轮:
- 结果为
"987,654,321"。
- 从右向左遍历整数部分
-
拼接整数和小数部分:最终的结果是
"987,654,321"。
输出:987,654,321
代码
import java.math.BigDecimal;public class Main {public static String solution(String s) {// 去掉前置无效 0(使用 BigDecimal)BigDecimal number = new BigDecimal(s);String str = number.toPlainString(); // 转化为普通字符串,保留小数部分但无科学计数法// 分离整数部分和小数部分String[] parts = str.split("\\."); // 用 "." 分割字符串String integerPart = parts[0]; // 整数部分String decimalPart = parts.length > 1 ? parts[1] : ""; // 小数部分// 为整数部分添加千分位逗号StringBuilder formattedInteger = new StringBuilder();int count = 0;for (int i = integerPart.length() - 1; i >= 0; i--) {formattedInteger.append(integerPart.charAt(i));count++;if (count % 3 == 0 && i != 0) {formattedInteger.append(",");}}formattedInteger.reverse(); // 逆序还原// 拼接小数部分if (!decimalPart.isEmpty()) {return formattedInteger.toString() + "." + decimalPart;} else {return formattedInteger.toString();}}public static void main(String[] args) {// 测试用例System.out.println(solution("1294512.12412")); // 输出 '1,294,512.12412'System.out.println(solution("0000123456789.99")); // 输出 '1,234,567,889.99'System.out.println(solution("987654321")); // 输出 '987,654,321'}
}
提交结果

相关文章:
字节青训十五题-Java-数字字符串格式化
问题 问题描述 小M在工作时遇到了一个问题,他需要将用户输入的不带千分位逗号的数字字符串转换为带千分位逗号的格式,并且保留小数部分。小M还发现,有时候输入的数字字符串前面会有无用的 0,这些也需要精简掉。请你帮助小M编写程…...
搭建一个本地轻量级且好用的学习TypeScript语言的环境
需求说明 虽然 TypeScript 的在线 Playground 很方便 https://www.tslang.com.cn/play/,但毕竟是在浏览器中使用,没有本地的 IDE 那么顺手。所以我想搭建一个本地类似 Playground 的环境,这样在学习 TypeScript 的过程中,可以更方…...
apex安装
安装过程复杂曲折,网上说的很多办法,貌似成功了,实际还是没起作用。 先说成功过程,执行下面命令,安装成功(当然,前提是你要先配置好编译环境): (我的环境&a…...
会员制电商创新:开源 AI 智能名片与 2+1 链动模式的协同赋能
摘要:本文聚焦于电商领域会员制的关键作用,深入探讨在传统交易模式向数字化转型过程中,如何借助开源 AI 智能名片以及 21 链动模式商城小程序,实现对会员数据的精准挖掘与高效利用,进而提升企业的营销效能与客户洞察能…...
Vue 3 和 Electron 来构建一个桌面端应用
我们将使用 Vue 3 和 Electron 来构建一个桌面端应用,该应用可以通过 Websocket 与服务器进行通信,并实现心跳检测、客户端上线、获取资产信息以及修改资产状态的功能。以下是实现步骤的概述: 项目结构:创建一个 Vue 3 项目&…...
生物医学信号处理--绪论
前言 参考书籍:刘海龙,生物医学信号处理,化学工业出版社 生物医学信号分类 1、由生理过程自发或者诱发产生的电生理信号和非电生理信号 • 电生理信号:ECG/心电、EEG/脑电、EMG/肌电、 EGG/胃电、 EOG/眼电 • 非电生理信号&am…...
STM32之CAN通讯(十一)
STM32F407 系列文章 - CAN通讯(十一) 目录 前言 一、CAN 二、CAN驱动电路 三、CAN软件设计 1.CAN状态初始化 2.头文件相关定义 3.接收中断服务函数 4.用户层使用 1.用户层相关定义 2.发送数据 3.接收数据 1.查询方式处理 2.中断方式处理 3…...
在macOS上安装MySQL
macOS的MySQL有多种不同的形式: 1、本机包安装程序,它使用本机macOS安装程序(DMG)引导您完成MySQL的安装。有关详细信息,请参阅第2.4.2节,“使用本机包在macOS上安装MySQL”。您可以将包安装程序与macOS一…...
netty解码器LengthFieldBasedFrameDecoder用法详解
Netty Netty是一个高性能、异步事件驱动的网络应用程序框架,它提供了对并发和异步编程的抽象,使得开发网络应用程序变得更加简单和高效。 在Netty中,EventLoopGroup是处理I/O操作的多线程事件循环器。在上面的示例中,我们创建了两个EventLoopGroup实例:bossGroup和worker…...
在循环链表中用头指针和用尾指针的好处
循环链表是一种特殊的链表结构,其中最后一个节点的指针指向链表的头部,形成一个环。这种结构在某些情况下可以提供便利,特别是在需要循环访问元素或者实现循环队列时。使用头指针和尾指针来操作循环链表各有其优势: 使用头指针的…...
java项目之网上租贸系统源码(springboot+mysql+vue)
风定落花生,歌声逐流水,大家好我是风歌,混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的网上租贸系统。项目源码以及部署相关请联系风歌,文末附上联系信息 。 项目简介: 基于Spring Boot的网上租贸…...
我用AI学Android Jetpack Compose之入门篇(3)
前一篇解释了代码,这一篇来解释脚本,gradle, compose脚本也推荐kotlin的,让Ai解释一下吧,以下答案来自 通义千问 1.解释一下下述脚本 这段代码是一个Gradle构建脚本的顶层配置文件,通常位于项目的根目录下…...
get和post有什么区别
GET和POST是HTTP协议中两种常用的请求方法,它们在用途、参数传递方式、缓存处理、安全性等方面存在显著差异。 以下是对GET和POST区别的详细讲解,并给出示例演示。 一、GET和POST的区别 用途 GET:主要用于获取信息,即进行查询操…...
编排式 Saga 模式
编排式 Saga 模式(Orchestrated Saga)是指由一个中央协调者(Orchestrator)控制多个服务间的事务执行。与协作式 Saga 模式不同,编排式 Saga 模式不依赖于事件驱动,而是通过协调者来控制整个 Saga 流程的执行…...
QT 下拉菜单设置参数 起始端口/结束端口/线程数量 端口扫描4
上篇文章QT实现 端口扫描暂停和继续功能 3-CSDN博客 双击 添加对话框类 界面设计 由于主体代码已经写完,只需要更改参数的获取即可 获取起始端口结束端口的输入 槽函数 给主界面类添加调用对话框类的功能 实现功能:点击菜单项可以弹出对话框窗体 增加槽…...
缓存-Redis-常见问题-缓存击穿-永不过期+逻辑过期(全面 易理解)
缓存击穿(Cache Breakdown) 是在高并发场景下,当某个热点数据在缓存中失效或不存在时,瞬间大量请求同时击中数据库,导致数据库压力骤增甚至崩溃的现象。为了解决这一问题,“永不过期” “逻辑过期” 的策略…...
137. 只出现一次的数字 II
137. 只出现一次的数字 II 题目-中等难度1. 位运算2. 位运算 题目-中等难度 给你一个整数数组 nums ,除某个元素仅出现 一次 外,其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。 你必须设计并实现线性时间复杂度的算法且使用常数…...
【力扣热题100】—— Day18.将有序数组转换为二叉搜索树
期末考试完毕,假期学习开始! —— 25.1.7 108. 将有序数组转换为二叉搜索树 给你一个整数数组 nums ,其中元素已经按 升序 排列,请你将其转换为一棵平衡二叉搜索树。 示例 1: 输入:nums [-10,-3,0,5,9] …...
PyTorch 官方文档 中文版本
文档来源 https://pytorch.cadn.net.cn 大多数机器学习工作流都涉及处理数据、创建模型、优化模型 参数,并保存经过训练的模型。本教程向您介绍完整的 ML 工作流 在 PyTorch 中实现,并提供了用于了解有关每个概念的更多信息的链接。 我们将使用 Fashion…...
电力智能问答RAG: 多问题生成、思维链提示生成;混合编码和重排序策略
电力智能问答RAG 目录 电力智能问答RAG文档转换、元信息抽取与增强及文档解析模块多问题生成、思维链提示生成和指令微调数据集构建模块混合编码和重排序策略文档转换、元信息抽取与增强及文档解析模块 在电力领域的知识处理中,文档转换、元信息抽取与增强及文档解析模块发挥…...
XML Group端口详解
在XML数据映射过程中,经常需要对数据进行分组聚合操作。例如,当处理包含多个物料明细的XML文件时,可能需要将相同物料号的明细归为一组,或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码,增加了开…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
Java 语言特性(面试系列1)
一、面向对象编程 1. 封装(Encapsulation) 定义:将数据(属性)和操作数据的方法绑定在一起,通过访问控制符(private、protected、public)隐藏内部实现细节。示例: public …...
K8S认证|CKS题库+答案| 11. AppArmor
目录 11. AppArmor 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、切换节点 3)、切换到 apparmor 的目录 4)、执行 apparmor 策略模块 5)、修改 pod 文件 6)、…...
Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
PPT|230页| 制造集团企业供应链端到端的数字化解决方案:从需求到结算的全链路业务闭环构建
制造业采购供应链管理是企业运营的核心环节,供应链协同管理在供应链上下游企业之间建立紧密的合作关系,通过信息共享、资源整合、业务协同等方式,实现供应链的全面管理和优化,提高供应链的效率和透明度,降低供应链的成…...
vscode(仍待补充)
写于2025 6.9 主包将加入vscode这个更权威的圈子 vscode的基本使用 侧边栏 vscode还能连接ssh? debug时使用的launch文件 1.task.json {"tasks": [{"type": "cppbuild","label": "C/C: gcc.exe 生成活动文件"…...
Linux云原生安全:零信任架构与机密计算
Linux云原生安全:零信任架构与机密计算 构建坚不可摧的云原生防御体系 引言:云原生安全的范式革命 随着云原生技术的普及,安全边界正在从传统的网络边界向工作负载内部转移。Gartner预测,到2025年,零信任架构将成为超…...
Spring AI 入门:Java 开发者的生成式 AI 实践之路
一、Spring AI 简介 在人工智能技术快速迭代的今天,Spring AI 作为 Spring 生态系统的新生力量,正在成为 Java 开发者拥抱生成式 AI 的最佳选择。该框架通过模块化设计实现了与主流 AI 服务(如 OpenAI、Anthropic)的无缝对接&…...
