Java去掉小数点后面无效0的方案与建议
作者:安一缸 发布时间:2023-11-29 11:46:57
一:需求
当小数位很多的时候,小数位后面可能有一些多余的0并没有任何实际意义。所以在某些业务需求下可以去掉这些多余的0。例如:0.2000可以用0.2来表示。
二:方案
2.1 正则匹配
/**
* 去掉给定字符串(小数)后面的无效0
*
* @param value 小数的字符串表示
* @return 如果转换失败,返回null
*/
public String convertByPattern(String value) {
String regex = "^(-?\\d*)(\\.?0*)$";
Matcher matcher = Pattern.compile(regex).matcher(value);
if (matcher.find()) {
return matcher.group(1);
}
String regex1 = "^(-?\\d*\\.\\d*[1-9])(0*)$";
Matcher matcher1 = Pattern.compile(regex1).matcher(value);
if (matcher1.find()) {
return matcher1.group(1);
}
return null;
}
当使用正则匹配的时候,需要代码中的两种正则表达式来进行匹配判断组合。第一种正则表达式用来匹配小数点后面全是0的值,例如122.000。第二种正则表达式用来匹配小数点后面存在非0数值的值,例如109.00200。
上述方法支持正数和负数的处理
在正则表达式中,使用分组的方式来实现,在正则匹配过程中,将要保留的部分放在第一个括号中,即组1,那么最终获取值的时候,就可以使用group(1)直接拿到
关于两个表达式:
表达式1:^(-?\d*)(\.?0*)$:
  -?:正负数的匹配均支持
  \d*:0个到n个数字,即匹配整数部分
  到这里,小数点前面部分就匹配完了,所以前面的部分可以作为第一组
  \.?:可以匹配0个或1个小数点
  0*:可以匹配0个或1个数值0
  第二个分组可有可无。因为表达式1主要使用用来识别出无小数点或者是小数点后面是若干个0的格式
表达式2:^(-?\d*\.\d*[1-9])(0*)$:
  -?:正负数的匹配均支持
  \d*:0个到n个数字,即匹配整数部分
  \.:匹配小数点
  \d*[1-9]:匹配小数部分,因为表达式2的目的是匹配小数点后面存在非0数值。那么[1-9]就是用来匹配最后一个非0数值的
  (0*) $:如果最后一个为是非0数值,那么不会匹配到任何。如果最后一位是0,那么这里匹配到的就是最后一个非0数值后面的所有0
2.2 BigDecimal
/**
* 通过将字符串(小数)转换为decimal
* @param value 小数的字符串表示
* @return
*/
public String convertByBigDecimal(String value) {
BigDecimal bigDecimal = new BigDecimal(value);
BigDecimal bigDecimal1 = bigDecimal.stripTrailingZeros();
return bigDecimal1.toPlainString();
}
上述方法是将字符串转换为BigDecimal ,然后使用BigDecimal 原生方法stripTrailingZeros来去掉后面的无效0。同样的正负数均支持
三:测试
public static void main(String[] args) {
/**
* (-)100
* (-)123
* (-)123.0000
* (-)100.0000
* (-)123.0
* (-)100.0
* (-)123.0900
* (-)100.0900
* (-)123.0009
* (-)100.0009
*/
List<String> strings = Arrays.asList("100", "-100",
"123", "-123",
"123.0000", "-123.0000",
"100.0000", "-100.0000",
"123.0", "-123.0",
"100.0", "-100.0",
"123.0900", "-123.0900",
"100.0900", "-100.0900",
"123.0009", "-123.0009",
"100.0009", "-100.0009");
for (String value : strings) {
String s = new ZeroFormatTest2().convertByPattern(value);
String s1 = new ZeroFormatTest2().convertByBigDecimal(value);
System.out.println(s + "----" + s1);
}
}
结果输出:
100----100
-100-----100
123----123
-123-----123
123----123
-123-----123
100----100
-100-----100
123----123
-123-----123
100----100
-100-----100
123.09----123.09
-123.09-----123.09
100.09----100.09
-100.09-----100.09
123.0009----123.0009
-123.0009-----123.0009
100.0009----100.0009
-100.0009-----100.0009
四:建议
上述两种方法都可以实现我们的需求,但是从性能上面来讲,如果需要解析大量数据的时候,建议使用第一种,Pattern.compile(regex)可以是一个全局的,不需要每一条数据都实例化
来源:https://blog.csdn.net/javadocdoc/article/details/122989219
猜你喜欢
- 前言相信很多Java开发都遇到过一个面试题:Resource和Autowired的区别是什么?这个问题的答案相信基本都清楚,但是这两者在Sp
- 一、栈(Stack)1、什么是栈?栈其实就是一种数据结构 - 先进后出(先入栈的数据后出来,最先入栈的数据会被压入栈底)什么是java虚拟机
- 【程序1】 题目:有1、2、3、4个数字,能组成多少个互不相同且无重复数字的三位数?都是多少? 1.程序分析:可填在百位、十位、个位的数字都
- 记录一下使用IDEA创建servlet并使用Tomcat本地部署的过程。需要安装好的软件首先IDEA社区版不支持Java EE,因此要使用U
- strftime函数主要用于时间格式化,它的函数原型如下:size_t __cdecl strftime(char * __restrict
- 参考答案java.sql.Date 是 java.util.Date 的子类java.util.Date 是 JDK 中的日期类,精确到时、
- 自然排序TreeSet集合在存储数据时有一定的顺序,它会将一些数据进行比较,比较调用的是comparaTo()方法,该方法是在Compara
- 这篇文章主要介绍了Java数组索引异常产生及解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 本文实例为大家分享了Struts2框架拦截 器实例的示例代码,供大家参考,具体内容如下在看拦截 器的小例子的前我们先来看看sturts2的原
- 一、什么是备忘录模式定义:在不破坏封闭的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。这样以后就可将该对象恢复到原先保存的状态
- spring与IoCIoC:控制反转,将由代码操纵的对象控制权,交给第三方容器,反转给第三方容器。这种对象依赖的关系管理方式,称作IoC。I
- 我们知道java程序是运行在JVM中的,而JVM就是构建在内存上的虚拟机,那么内存模型JMM是做什么用的呢?我们考虑一个简单的赋值问题:in
- 一、结构型模式结构型模式有什么好处?从程序的结构上实现松耦合,从而可以扩大整体的类结构,用来解决更大的问题二、适配器模式USB网线转换器三、
- 记录web项目部署到阿里云服务器步骤(使用 web项目、阿里云服务器、Xftp、Xshell),敬请参考和指正1.将要部署的项目打包成WAR
- Selenium IDE 是Firefox 浏览器的一个插件, 它会记录你对Firefox的操作,并且可以回放它的操作。 用法简单,不过我觉
- 导读 Spring Boot方式的项目开发已经逐步成为Java应用开发领域的主流框架,它不仅可以方便地创建生产级的Spring应用
- 本文实例为大家分享了Android自定义带圆点的半圆形进度条,供大家参考,具体内容如下仅限用于半圆形,如须要带圆点的圆形进度条,圆点会出现错
- 前言上一篇我们介绍了使用 sqflite 这个数据库工具在 Flutter 的应用中建立本地数据库的实例应用。了解过数据库的同学应该会知道,
- 新建一个集合List<Bill> billList = new ArrayList<>();将订单中所有物品的名称提
- 本文实例讲解了iOS从背景图中取色的代码,分享给大家供大家参考,具体内容如下实现代码:void *bitmapData; //内存空间的指针