decimal类型在java是怎么用的呢?下面就让我们一起来了解一下吧:
decimal在java中一般是用BigDecimal来表示的,通常可用于计算、计费等,由于使用Double类型所造成的结果可能会与期望值有一些偏差,因此使用decimal类型进行计算会更好一些。
decimal在java中用BigDecimal表示时的示例代码如下:
@Column(length=10 ,scale=2) // length表示长度 , scale表示小数点后位数
private BigDecimal money;
当然,需要注意的是,使用BigDecimal多是用于操作运算加减乘除,示例代码介绍如下:
BigDecimal num1 = new BigDecimal("100");
BigDecimal num2 = new BigDecimal("50");
//加法
BigDecimal result1 = num1.add(num2);
//减法
BigDecimal result2 = num1.subtract(num2);
//乘法
BigDecimal result3 = num1.multiply(num2);
//除法
BigDecimal result4 = num1.divide(num2);
拓展:
BigDecimal类型与string,Double类型的相互转换是怎样的呢?
1、
若是将String类型转成BigDecimal类型,示例代码为:
BigDecimal bd = new BigDecimal("xxx");
String str = bd.toString();
2、
若是将double类型转化为BigDecimal,示例代码为:
Double a=1.23;
BigDecimal c = BigDecimal.valueOf(a);
但不能使用:
BigDecimal decimal= new BigDecimal(a);
3、
若是将BigDecimal类型转化为double,示例代码为:
BigDecimal bd;
double d = bd.doubleValue();
以上就是小编的分享了,希望能够帮助到大家。
字符串、数字、日期格式化工具-Format
一听到Format,我觉得第一时间想来的是SimpleDateFormat,这个是最常用的,实际上,在Format这个抽象类下,有很多的实现工具,今天我们一起看一下。
Format结构
Format所在包:java.text.Format
Format是一个抽象类,提供了两种方法:
public abstract StringBuffer format();public abstract Object parseObject ();
两个分别用来解析字符串和将字符串解析。
我们重点说format格式化成字符串
DateFormat本身DateFormat是一个抽象类,我们并没有办法直接创建,但是我想大家对另外一个类肯定很熟悉,就是SimpleDateFormat,这个类可以让我们自定义格式化日期,实际上,它就是DateFormat的实现类。
但是DateFormat虽然不能实例化,但是它提供了实例化方法
Date date = new Date();DateFormat dateFormat = DateFormat.getDateInstance();System.out.println( dateFormat.format(date));//输出结果:2024-11-19DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.FULL);//输出结果:2024年11月19日 星期二DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.LONG);//输出结果:2024年11月19日DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.short);//输出结果:24-11-19//下面这个是默认参数,可以不填写DateFormat dateFormat = DateFormat.getDateInstance(DateFormat.MEDIUM);//输出结果:2024-11-19
Date date = new Date();DateFormat dateFormat = DateFormat.getTimeInstance();System.out.println(dateFormat.format(date));//输出结果:15:40:09DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.FULL);//下午03时41分34秒 CSTDateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.LONG);//下午03时41分52秒DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.SHORT);//下午3:42//下面这个是默认参数,可以不填写DateFormat dateFormat = DateFormat.getTimeInstance(DateFormat.MEDIUM);//15:50:12
接下来的getDateTimeInstance其实就是getDateInstance和getTimeInstance的组合,因此它提供了两个可选参数来控制date位和time位
Date date = new Date();DateFormat dateTimeInstance = DateFormat.getDateTimeInstance();System.out.println(dateTimeInstance.format(date));//输出结果:2024-11-19 12:15:13//这是默认输出,实际上,我们可以通过改变参数来输出一些个性化的内容//入参有两个,分别控制date部分和time部分DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.FULL,DateFormat.FULL);//输出结果:2024年11月19日 星期二 下午12时20分33秒 CSTDateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.LONG,DateFormat.LONG);//输出结果:2024年11月19日 下午12时22分38秒DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.SHORT,DateFormat.SHORT);//输出结果:24-11-19 下午12:23//下面这个是默认参数,可以不填写DateFormat dateTimeInstance = DateFormat.getDateTimeInstance(DateFormat.MEDIUM,DateFormat.MEDIUM);//输出结果:2024-11-19 12:23:43
这个其实就是getDateTimeInstance
Date date = new Date();DateFormat dateFormat = DateFormat.getInstance();System.out.println(dateFormat.format(date));//输出结果:24-11-19 下午3:52
查看源代码:
NumerFormatnumberFormat本身也是一个抽象类,与DateFormat相似,NumberFormat也提供了通过getInstance的方式来获取实例
double num = 1220.0455121;NumberFormat integerInstance = NumberFormat.getIntegerInstance();System.out.println(integerInstance.format(num));//输出结果:1,220
double num = 1220.0455121;NumberFormat numberInstance = NumberFormat.getNumberInstance();System.out.println(numberInstance.format(num));//输出结果:1,220.046
double num = 1220.0455121;NumberFormat currencyInstance = NumberFormat.getCurrencyInstance();//输出结果:¥1,220.05//我们可以更改地区来输出不同的结果NumberFormat currencyInstance = NumberFormat.getCurrencyInstance(Locale.CANADA);//输出结果:$1,220.05
double num = 1220.0455121;NumberFormat percentInstance = NumberFormat.getPercentInstance();//输出结果:122,005%String a="11%";System.out.println(NumberFormat.getPercentInstance().parse(a));//输出结果:0.11DecimalFormat
它是NumberFormat的实现类,用于格式化十进制数字。它具有各种特性,可以解析和格式化数字,包括:西方数字、阿拉伯数字和印度数字。它还支持不同种类的数字,包括:整数(123)、小数(123.4)、科学记数法(1.23E4)、百分数(12%)和货币金额($123)。
在DecimalFormat构造器中,我们可以通过传入指定的参数,让DecimalFormat帮助我们将数字格式化成我们想要的样子
符号 | 释义 |
0 | Digit代表一个数字 |
# | Digit。若是0就显示为空 |
. | 小数/货币分隔符 |
- | 减号 |
, | 分组分隔符 |
E | 科学计数法分隔符(位数和指数) |
% | 乘以100并显示为百分数 |
' | 用于引用特殊字符。作用类似于转义字符 |
我们来说一下常用参数的用法
//输出指定的位数double num=2.332323;DecimalFormat decimalFormat = new DecimalFormat("0");System.out.println(decimalFormat.format(num));//输出结果:2DecimalFormat decimalFormat = new DecimalFormat("0.000000000");//输出结果:2.332323000
//与0相似,区别在于不会补充0double num=2.332323;DecimalFormat decimalFormat = new DecimalFormat("#");System.out.println(decimalFormat.format(num));//输出结果:2DecimalFormat DecimalFormat = new DecimalFormat("#.############");System.out.println(decimalFormat.format(num));//输出结果:2.332323
//从右到左,按指定位数分割,','左边出现参数无用double num=233232322;DecimalFormat decimalFormat = new DecimalFormat(",###");System.out.println(decimalFormat.format(num));//输出结果:233,232,322double num=233232322;DecimalFormat decimalFormat = new DecimalFormat("##,###");//输出结果:233,232,322//与上面无差别
double num=0.12;DecimalFormat decimalFormat = new DecimalFormat("##.00%");System.out.println(decimalFormat.format(num));//输出结果:12.00%double num=0.12;DecimalFormat decimalFormat = new DecimalFormat("##%");//输出结果:12%ChoiceFormat
它是NumberFormat的实现类,以double数组为键,String数组为值,通过double值获取指定的字符串,注意:两者必须长度一致,不然会报错。
double[] doubles={1,2,3,4,5,6,7};String[] strings={"周一","周二","周三","周四","周五","周六","周日"};ChoiceFormat choiceFormat = new ChoiceFormat(doubles,strings);System.out.println(choiceFormat.format(3));//参数位于3和4之间,取3System.out.println(choiceFormat.format(3.4));System.out.println(choiceFormat.format(3.6));//超过最大值,取最大的那个System.out.println(choiceFormat.format(8));//输出结果:周三//输出结果:周三//输出结果:周三//输出结果:周日MessageFormat
感觉这个是最常用的
基础用法:
//创建MessageFormat的方式MessageFormat messageFormat = new MessageFormat("小王是一个:{0},他今年:{1}岁了");System.out.println(messageFormat.format(new Object[]{"大帅比", 18}));//直接使用静态方法System.out.println(MessageFormat.format("小王是一个:{0},他今年:{1}岁了", "大帅比", 18));//输出结果:小王是一个:大帅比,他今年:18岁了//输出结果:小王是一个:大帅比,他今年:18岁了
在{}中,除了必要的下标之外,后面还支持FormatType和FormatStyle两位,这两位是非必需的。
{ ArgumentIndex , FormatType , FormatStyle }
MessageFormat messageFormat = new MessageFormat("小王是一个:{0},他今年:{1,number,##.#}岁了");System.out.println(messageFormat.format(new Object[]{"大帅比", 1.33234}));//输出结果:小王是一个:大帅比,他今年:1.3岁了
FormatType(只支持以下四种):
FormatStyle:
日期支持
时间支持
数字支持:
通过举例我们来发现规律:
MessageFormat.format("小王是一个:{0},他今年:{1}岁了,今天是他的生日:{2,date}", "大帅比", 18,new Date())//输出结果:小王是一个:大帅比,他今年:18岁了,今天是他的生日:2024-11-20System.out.println(MessageFormat.format("小王是一个:{0},他今年:{1}岁了,今天是他的生日:{2,date,full}", "大帅比", 18,new Date()));//输出结果:小王是一个:大帅比,他今年:18岁了,今天是他的生日:2024年11月20日 星期三MessageFormat.format("小王是一个:{0},他今年:{1}岁了,今天是他的生日:{2,date,long}", "大帅比", 18,new Date())//输出结果:小王是一个:大帅比,他今年:18岁了,今天是他的生日:2024年11月20日MessageFormat.format("小王是一个:{0},他今年:{1}岁了,今天是他的生日:{2,date,long},现在是:{3,time}", "大帅比", 18,new Date(),new Date())//输出结果:小王是一个:大帅比,他今年:18岁了,今天是他的生日:2024年11月20日,现在是:9:46:53
在格式化date时,我们的第二个FormatType其实决定了使用哪个Format,date对应了DateFormat.getDateInstance,time对应来DateFormat.getTimeInstance;而第三个参数则是我们在使用DateFormat.getTimeInstance传入的参数,只不过当时是数字,现在是字符串。
MessageFormat.format("小王是一个:{0},他今年:{1,number,##}岁了", "大帅比", 18.32323)//输出结果:小王是一个:大帅比,他今年:18岁了MessageFormat.format("小王是一个:{0},他今年:{1,number,##.#}岁了", "大帅比", 18.32323)//输出结果:小王是一个:大帅比,他今年:18.3岁了MessageFormat.format("小王是一个:{0},他今年:{1,number,##.#}岁了,他已经活了人生的:{2,number,0%}", "大帅比", 18.32323,0.1)//输出结果:小王是一个:大帅比,他今年:18.3岁了,他已经活了人生的:10%MessageFormat.format("小王是一个:{0},他今年:{1,number,##.#}岁了,他已经活了人生的:{2,number,0%},已经挣了:{3,number,currency}元", "大帅比", 18.32323,0.1,1000000)//输出结果:小王是一个:大帅比,他今年:18.3岁了,他已经活了人生的:10%,已经挣了:¥1,000,000.00元MessageFormat.format("{0,number,percent}", 0.255)//输出结果:26%
几个关键点:
//索引值必需从0开始,否则所有索引值均失效,参考下面MessageFormat.format("{1} - {1}", 1)//输出结果:{1} - {1}//实际传入的参数与索引个数不匹配,不会有问题MessageFormat.format("{0} - {1}", 1)//输出结果:1 - {1}MessageFormat.format("{0} - {1}", 1, 2, 3)//输出结果:1 - 2//使用一个'时会将{变成字符串,将不会被解析MessageFormat.format("'{0} - {1}",1, 2)//输出结果:{0} - {1}//使用两个'时会被解析MessageFormat.format("''{0} - {1}", 1, 2)//输出结果:'1 - 2MessageFormat.format("'{0}' - {1}", 1, 2)//输出结果:{0} - 2MessageFormat.format("''{0}'' - {1}", 1, 2)//输出结果:'1' - 2//缺少{时只会被当成普通字符串MessageFormat.format("0} - {1}", 1, 2))//输出结果:0} - 2//但是缺少}却会报错MessageFormat.format("{0 - {1}", 1, 2)//输出结果:Unmatched braces in the pattern