字节青训十五题-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文档转换、元信息抽取与增强及文档解析模块多问题生成、思维链提示生成和指令微调数据集构建模块混合编码和重排序策略文档转换、元信息抽取与增强及文档解析模块 在电力领域的知识处理中,文档转换、元信息抽取与增强及文档解析模块发挥…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...

【WiFi帧结构】
文章目录 帧结构MAC头部管理帧 帧结构 Wi-Fi的帧分为三部分组成:MAC头部frame bodyFCS,其中MAC是固定格式的,frame body是可变长度。 MAC头部有frame control,duration,address1,address2,addre…...

【Redis技术进阶之路】「原理分析系列开篇」分析客户端和服务端网络诵信交互实现(服务端执行命令请求的过程 - 初始化服务器)
服务端执行命令请求的过程 【专栏简介】【技术大纲】【专栏目标】【目标人群】1. Redis爱好者与社区成员2. 后端开发和系统架构师3. 计算机专业的本科生及研究生 初始化服务器1. 初始化服务器状态结构初始化RedisServer变量 2. 加载相关系统配置和用户配置参数定制化配置参数案…...
在Ubuntu24上采用Wine打开SourceInsight
1. 安装wine sudo apt install wine 2. 安装32位库支持,SourceInsight是32位程序 sudo dpkg --add-architecture i386 sudo apt update sudo apt install wine32:i386 3. 验证安装 wine --version 4. 安装必要的字体和库(解决显示问题) sudo apt install fonts-wqy…...

JVM 内存结构 详解
内存结构 运行时数据区: Java虚拟机在运行Java程序过程中管理的内存区域。 程序计数器: 线程私有,程序控制流的指示器,分支、循环、跳转、异常处理、线程恢复等基础功能都依赖这个计数器完成。 每个线程都有一个程序计数…...

【JVM】Java虚拟机(二)——垃圾回收
目录 一、如何判断对象可以回收 (一)引用计数法 (二)可达性分析算法 二、垃圾回收算法 (一)标记清除 (二)标记整理 (三)复制 (四ÿ…...
「全栈技术解析」推客小程序系统开发:从架构设计到裂变增长的完整解决方案
在移动互联网营销竞争白热化的当下,推客小程序系统凭借其裂变传播、精准营销等特性,成为企业抢占市场的利器。本文将深度解析推客小程序系统开发的核心技术与实现路径,助力开发者打造具有市场竞争力的营销工具。 一、系统核心功能架构&…...
第八部分:阶段项目 6:构建 React 前端应用
现在,是时候将你学到的 React 基础知识付诸实践,构建一个简单的前端应用来模拟与后端 API 的交互了。在这个阶段,你可以先使用模拟数据,或者如果你的后端 API(阶段项目 5)已经搭建好,可以直接连…...

聚六亚甲基单胍盐酸盐市场深度解析:现状、挑战与机遇
根据 QYResearch 发布的市场报告显示,全球市场规模预计在 2031 年达到 9848 万美元,2025 - 2031 年期间年复合增长率(CAGR)为 3.7%。在竞争格局上,市场集中度较高,2024 年全球前十强厂商占据约 74.0% 的市场…...