参考链接:
NumberFormat
DecimalFormat的使用
DecimalFormat
解决DecimalFormat的0.00
import java.math.RoundingMode;
import java.text.*;
public class Demo {
public static void main(String[] args) {
Demo demo = new Demo();
demo.testGetInstance();
// demo.testSetDigits();
// demo.testRoundingMode();
// demo.testParse();
demo.decimalFormatTest();
}
public void testGetInstance() {
double d = 23323.3323232323;
//返回当前缺省语言环境的【缺省数值】格式
System.out.println(NumberFormat.getInstance().format(d));//23,323.332
//返回当前缺省语言环境的【货币】格式
System.out.println(NumberFormat.getCurrencyInstance().format(d));//¥23,323.33
//返回当前缺省语言环境的【通用数值】格式
System.out.println(NumberFormat.getNumberInstance().format(d));//23,323.332
//返回当前缺省语言环境的【整数】格式
System.out.println(NumberFormat.getIntegerInstance().format(d));//23,323
//返回当前缺省语言环境的【百分比】格式
System.out.println(NumberFormat.getPercentInstance().format(d));//2,332,333%
// 去除逗号分隔符
NumberFormat numberFormat = NumberFormat.getInstance();
numberFormat.setGroupingUsed(false);// 是否以逗号隔开, 默认true以逗号隔开,
System.out.println(numberFormat.format(d));//23323.332
}
public void decimalFormatTest() {
//0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置
double pi = 3.1415927;//圆周率
//取一位整数
System.out.println(new DecimalFormat("0").format(pi));//3
//取一位整数和两位小数
System.out.println(new DecimalFormat("0.00").format(pi));//3.14
//取两位整数和三位小数,整数不足部分以0填补。
System.out.println(new DecimalFormat("00.000").format(pi));// 03.142
//取所有整数部分
System.out.println(new DecimalFormat("#").format(pi));//3
//以百分比方式计数,并取两位小数
System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%
long c =299792458;//光速
//显示为科学计数法,并取五位小数
System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8
//显示为两位整数的科学计数法,并取四位小数
System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7
//每三位以逗号进行分隔。
System.out.println(new DecimalFormat(",###").format(c));//299,792,458
//将格式嵌入文本
System.out.println(new DecimalFormat("光速大小为每秒,###米。").format(c));//光速大小为每秒299,792,458米。
//每三位以逗号进行分隔,保留两位小数点
double d1 = 1234567111.89;
System.out.println(d1); //1.23456711189E9
System.out.println(new DecimalFormat(",##0.00").format(d1)); //1,234,567,111.89
//每三位以逗号进行分隔,保留两位小数点
double d2 = 1234567111.80;
System.out.println(new DecimalFormat(",##0.00").format(d2));//1,234,567,111.80
//每三位以逗号进行分隔,保留两位小数点
double d3 = 1234567111.00;
System.out.println(new DecimalFormat(",##0.00").format(d3));//1,234,567,111.00
double d5 = 0.00; // -0.00查看效果 -> -0.00
//每三位以逗号进行分隔,保留两位小数点
System.out.println(new DecimalFormat(",##0.00").format(d5));//0.00
double d6 = 0; // -0查看效果->0.00
//每三位以逗号进行分隔,保留两位小数点
System.out.println(new DecimalFormat(",##0.00").format(d6));//0.00
}
public void testSetDigits() {
NumberFormat format = NumberFormat.getInstance();
format.setParseIntegerOnly(true);//设置数是否应该仅作为整数进行解析。此方法只影响解析,与格式化无关
format.setMinimumFractionDigits(2);//设置数值的【小数部分】允许的最小位数。这几个方法只影响格式化,与解析无关
format.setMaximumFractionDigits(3);//设置数值的【小数部分】允许的最大位数
format.setMinimumIntegerDigits(1);//设置数值的【整数部分】允许的最小位数
format.setMaximumIntegerDigits(5);//设置数值的【整数部分】允许的最大位数
System.out.println(format.format(123.1234));//123.123
System.out.println(format.format(123.1000));//123.10
System.out.println(format.format(123456789.12345));//56,789.123
}
public void testRoundingMode() {
NumberFormat format = NumberFormat.getInstance();
format.setMaximumFractionDigits(0);//设置数值的【小数部分】允许的最大位数
System.out.println("默认模式为:" + format.getRoundingMode().name());//HALF_EVEN
System.out.println(format.format(5.6));//6。5以上不管是奇数还是偶数,5都舍入
System.out.println(format.format(5.4));//5。5以下不管是奇数还是偶数,5都舍去
System.out.println(format.format(1.5));//2。当是5时,若前一位是奇数,5就舍入
System.out.println(format.format(2.5));//2。当是5时,若前一位是偶数,5就舍去
format.setRoundingMode(RoundingMode.HALF_UP);//四舍五入。此方法只影响格式化,与解析无关
System.out.println("当前模式为:" + format.getRoundingMode().name());//HALF_UP
System.out.println(format.format(5.6));//6
System.out.println(format.format(5.4));//5
System.out.println(format.format(1.5));//2
System.out.println(format.format(2.5));//3
}
public void testParse() {
NumberFormat format = NumberFormat.getInstance();
format.setParseIntegerOnly(false);//设置数是否应该仅作为整数进行解析。此方法只影响解析,与格式化无关
format.setMinimumFractionDigits(2);//这几个方法只影响格式化,与解析无关
ParsePosition position = new ParsePosition(2);
try {
Number number = format.parse("00123.10050100结尾处不受影响");//如果无法解析字符串的【开头】则抛出ParseException
Number number2 = format.parse("开头00123.10050100结尾处不受影响", position);//解析字符串时,从position.getIndex()处开始解析
System.out.println(number.floatValue());//123.1005
System.out.println(number.intValue());//123
System.out.println(number2.doubleValue());//123.100501
System.out.println(position.getIndex());//16。解析前,代表解析开始处字符的索引;解析后,代表被解析的最后一个字符后的字符的索引
System.out.println(position.getErrorIndex());//-1。获取出错时的索引,如果没有设置错误索引,则为 -1
position.setIndex(1);//如果重用ParsePosition,须重新设置一下Index才可以
System.out.println(format.parse("12.345678只解析", position).floatValue());//2.345678
} catch (ParseException e) {
e.printStackTrace();
}
}
}