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

字节青训十五题-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,我们可以分以下几步:

  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.lryc.cn/news/517249.html

相关文章:

  • 搭建一个本地轻量级且好用的学习TypeScript语言的环境
  • apex安装
  • 会员制电商创新:开源 AI 智能名片与 2+1 链动模式的协同赋能
  • Vue 3 和 Electron 来构建一个桌面端应用
  • 生物医学信号处理--绪论
  • STM32之CAN通讯(十一)
  • 在macOS上安装MySQL
  • netty解码器LengthFieldBasedFrameDecoder用法详解
  • 在循环链表中用头指针和用尾指针的好处
  • java项目之网上租贸系统源码(springboot+mysql+vue)
  • 我用AI学Android Jetpack Compose之入门篇(3)
  • get和post有什么区别
  • 编排式 Saga 模式
  • QT 下拉菜单设置参数 起始端口/结束端口/线程数量 端口扫描4
  • 缓存-Redis-常见问题-缓存击穿-永不过期+逻辑过期(全面 易理解)
  • 137. 只出现一次的数字 II
  • 【力扣热题100】—— Day18.将有序数组转换为二叉搜索树
  • PyTorch 官方文档 中文版本
  • 电力智能问答RAG: 多问题生成、思维链提示生成;混合编码和重排序策略
  • C#高级:递归4-根据一颗树递归生成数据列表
  • PDFelement 特别版
  • 云计算在医疗行业的应用
  • (转)rabbitmq怎么保证消息不丢失?
  • 每日一题:链表中环的入口结点
  • k8s里面etcd的作用
  • 使用 uniapp 开发微信小程序遇到的坑
  • AlphaPi相关硬件驱动提取
  • 【学习笔记】数据结构(十)
  • Unity中 Xlua使用整理(二)
  • 刚体变换矩阵的逆