字节青训十五题-Java-数字字符串格式化

news/2025/1/8 5:52:53/

问题

问题描述

小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,我们可以分以下几步:

  1. 去掉前置无效的 0

    • 如果字符串以多个 0 开头(如 "0000123.45"),需要去掉这些无效的 0
    • 使用 BigDecimal 是一个方便的方式,它可以自动处理数字的前置 0,并保留小数部分。
  2. 分离整数部分和小数部分

    • split("\\.") 方法将字符串按小数点分成整数部分和小数部分。
    • 如果没有小数点(如 "123456"),则只需处理整数部分。
  3. 格式化整数部分

    • 从右往左遍历整数部分的字符,每隔 3 个字符插入一个逗号。
    • 注意在第一个字符前不添加逗号。
  4. 重新组合结果

    • 如果存在小数部分,则将格式化后的整数部分与小数部分用小数点 . 拼接。
    • 如果没有小数部分,则直接返回格式化后的整数部分。

解释

输入示例 1:"1294512.12412"

  1. 去掉前导零:通过 BigDecimal 处理字符串 1294512.12412,去掉前导零后得到的是 1294512.12412,无需变动。

  2. 转换为普通字符串number.toPlainString() 将该数字转化为 1294512.12412 字符串。

  3. 分离整数和小数部分:通过 split("\\.") 分割字符串,得到整数部分 "1294512" 和小数部分 "12412"

  4. 添加千分位逗号

    • 从右向左遍历整数部分 "1294512",每3位插入一个逗号:
      • 第一轮:2"2"
      • 第二轮:1"21"
      • 第三轮:5"521"
      • 第四轮:4"4521"
      • 第五轮:9"94521"
      • 第六轮:2"294521"
      • 第七轮:1"1294521"
    • 结果为 "1,294,512"
  5. 拼接整数和小数部分:最终的结果是 "1,294,512.12412"

输出1,294,512.12412

输入示例 2:"0000123456789.99"

  1. 去掉前导零:通过 BigDecimal 处理字符串 0000123456789.99,去掉前导零后得到 123456789.99

  2. 转换为普通字符串number.toPlainString() 得到 123456789.99 字符串。

  3. 分离整数和小数部分:通过 split("\\.") 分割字符串,得到整数部分 "123456789" 和小数部分 "99"

  4. 添加千分位逗号

    • 从右向左遍历整数部分 "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"
  5. 拼接整数和小数部分:最终的结果是 "1,234,567,889.99"

输出1,234,567,889.99

输入示例 3:"987654321"

  1. 去掉前导零:通过 BigDecimal 处理字符串 987654321,没有前导零,结果是 987654321

  2. 转换为普通字符串number.toPlainString() 得到 987654321 字符串。

  3. 分离整数和小数部分:通过 split("\\.") 分割字符串,得到整数部分 "987654321" 和小数部分 ""(没有小数部分)。

  4. 添加千分位逗号

    • 从右向左遍历整数部分 "987654321",每3位插入一个逗号:
      • 第一轮:1"1"
      • 第二轮:2"21"
      • 第三轮:3"321"
      • 第四轮:4"4321"
      • 第五轮:5"54321"
      • 第六轮:6"654321"
      • 第七轮:7"7654321"
      • 第八轮:8"87654321"
      • 第九轮:9"987654321"
    • 结果为 "987,654,321"
  5. 拼接整数和小数部分:最终的结果是 "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'}
}

提交结果


http://www.ppmy.cn/news/1561476.html

相关文章

基于ROS先验地图的机器人自主定位与导航SLAM

2021年学习,当时参加科大讯飞的智能车大赛, 【语音交互启动-teb算法路径规划A*算法自动避障路径最短优化yolo5目标检测视觉结果判断分类终点指定点位自动泊车语音播报。】 【讯飞学院】http://www.iflyros.com/home/ 一、全局路径规划中的地图 栅格地图&…

uniapp uni-popup使用scroll-view滚动时,底部按钮设置position:fixed失效,部分ios设置有问题

uniapp uni-popup使用scroll-view滚动时,底部按钮设置position:fixed失效,部分ios设置有问题 尝试过多种办法,最后发现部分机型position:fixed失效,position: sticky可以用,但是只设置sticky的话,部分机型…

Ungoogled Chromium127 编译指南 MacOS 篇(一)- 项目介绍

1. 引言 在当今互联网时代,浏览器不仅是我们访问网络的窗口,更是保护个人隐私的重要工具。然而,主流浏览器普遍存在数据收集和隐私问题。大多数用户可能并不知道,当我们使用 Chrome 浏览器时,会有大量的个人数据被收集…

云计算是如何帮助企业实现高可用性的

想象一下,你正在享受一个悠闲的周末,突然接到同事的电话:公司的核心系统宕机了!这个场景对很多IT从业者来说并不陌生。但在云计算时代,这样的噩梦正在逐渐远去。 一位前辈告诉我:"在技术世界里&#…

怎样用云手机进行海外社媒矩阵引流?

在出海电商领域,借助海外社交媒体平台进行引流已成为一种高效的推广方式。通过精确锁定目标受众,企业能够以较低的投入获得可观的流量,从而提升产品的转化率。而云手机技术的应用,则为这一过程提供了新的工具支持和操作优化。 选择…

oxml中创建CT_Document类

概述 本文基于python-docx源码,详细记录CT_Document类创建的过程,以此来加深对Python中元类、以及CT_Document元素类的认识。 元类简介 元类(MetaClass)是Python中的高级特性。元类是什么呢?Python是面向对象编程…

关于Mac中的shell

1 MacOS中的shell 介绍: 在 macOS 系统中,Shell 是命令行与系统交互的工具,用于执行命令、运行脚本和管理系统。macOS 提供了多种 Shell,主要包括 bash 和 zsh。在 macOS Catalina(10.15)之前&#xff0c…

MS7337M集成单通道视频运放与视频同轴线控解码

产品简述 MS7337M 是单通道视频放大器与视频同轴线控解码器为一体的 芯片。视频放大器内部集成 6dB 增益轨到轨输出驱动器以及 6 阶滤波 器, -3dB 带宽达 81MHz 。视频同轴线控解码器内部集成一颗高速处 理器,针对模数混合信号进行有效分离。…