java格式化数字 NumberFormat及DecimalFormat

一、JavaAPI官方描述

1、NumberFormat

NumberFormat帮助您格式化和解析任何区域设置的数字。您的代码可以完全独立于小数点,千位分隔符的区域设置约定,甚至是使用的特定十进制数字,或者数字格式是否为十进制。

2、 DecimalFormat

DecimalFormat是NumberFormat十进制数字格式的具体子类 。它具有多种功能,旨在解析和格式化任何语言环境中的数字,包括支持西方,阿拉伯语和印度语数字。它还支持不同类型的数字,包括整数(123),定点数(123.4),科学记数法(1.23E4),百分比(12%)和货币金额(123美元)。所有这些都可以本地化。

二、NumberFormat详解

1、获取NumberFormat实例


//创建 一个整数格式 地区用系统默认的
NumberFormat integerNumber = NumberFormat.getIntegerInstance(Locale.getDefault());

  1. 使用getInstance或getNumberInstance获取正常的数字格式。
  2. 使用getIntegerInstance得到的整数格式。
  3. 使用getCurrencyInstance来获取货币数字格式。
  4. 使用getPercentInstance获取显示百分比的格式。

2、常用方法

3、NumberFormat类的使用

要使用NumberFormat类,首先需要使用NumberFormat类的静态方法getNumberInstance()来获取一个NumberFormat实例,然后可以使用实例的format()方法将数字转换为字符串形式,也可以使用实例的parse()方法将字符串转换为数字形式。

4.NumberFormat类使用示例

// 1.创建一个实例
NumberFormat numberFormat = NumberFormat.getNumberInstance();
// 2.设置小数点后的位数
numberFormat.setMaximumFractionDigits(2);
// 3.设置是否使用千分位分隔符
numberFormat.setGroupingUsed(false);
// 4.将数字123456.789格式化为字符串“123456.79”
String result1 = numberFormat.format(123456.789);
System.out.println(result1); //输出结果:123456.79


三、DecimalFormat详解

1、获取NumberFormat实例

要获取特定地区(包括默认地区)的NumberFormat,请调用NumberFormat的工厂方法之一,例如getInstance()。通常,不要直接调用DecimalFormat构造函数,因为NumberFormat工厂方法可能返回DecimalFormat之外的子类。如果需要自定义format对象,可以这样做:

        try {
            NumberFormat f = NumberFormat.getInstance(Locale.getDefault());
            if (f instanceof DecimalFormat) {
                ((DecimalFormat) f).setDecimalSeparatorAlwaysShown(true);
                //写具体的代码
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

设置Pattern

DecimalFormat作为NumberFormat的具体实现子类,最大的特点就是 可以使用Pattern。来实现最大程度的对数据格式进行定制。
一个Pattern中的许多字符是按字面意思理解的;它们在解析期间匹配,在格式化期间输出不变,就是字符在Pattern中 不影响最后的数字格式化另一方面,特殊字符代表其他字符、字符串或字符类。如果要以文字形式出现在前缀或后缀中,必须引用它们(除非另有说明)。

2、子类特有的方法

3、代码示例

        //创建一个默认的通用格式
        NumberFormat numberFormat = NumberFormat.getInstance();
        DecimalFormat numberDecimalFormat;
        //捕捉异常,以防强制类型转换出错
        try {
            //强制转换成DecimalFormat
            numberDecimalFormat = (DecimalFormat) numberFormat;
            //保留小数点后面三位,不足的补零,前面整数部分 每隔四位 ,用 “,” 符合隔开
            numberDecimalFormat.applyPattern("#,####.000");
            //设置舍入模式 为DOWN,否则默认的是HALF_EVEN
            numberDecimalFormat.setRoundingMode(RoundingMode.DOWN);
            //设置 要格式化的数 是正数的时候。前面加前缀
            numberDecimalFormat.setPositivePrefix("Prefix  ");
            System.out.println("正数前缀  "+numberDecimalFormat.format(123456.7891));
            //设置 要格式化的数 是正数的时候。后面加后缀
            numberDecimalFormat.setPositiveSuffix("  Suffix");
            System.out.println("正数后缀  "+numberDecimalFormat.format(123456.7891));
            //设置整数部分的最大位数
            numberDecimalFormat.setMaximumIntegerDigits(3);
            System.out.println("整数最大位数 "+numberDecimalFormat.format(123456.7891));
            //设置整数部分最小位数
            numberDecimalFormat.setMinimumIntegerDigits(10);
            System.out.println("整数最小位数 "+numberDecimalFormat.format(123456.7891));
            //设置小数部分的最大位数
            numberDecimalFormat.setMaximumFractionDigits(2);
            System.out.println("小数部分最大位数 "+numberDecimalFormat.format(123.4));
            //设置小数部分的最小位数
            numberDecimalFormat.setMinimumFractionDigits(6);
            System.out.println("小数部分最小位数 "+numberDecimalFormat.format(123.4));
        }catch (Exception e){
            e.printStackTrace();
        }

四、DecimalFormat类符号含义

DecimalFormat 类主要靠 # 和 0 两种占位符号来指定数字长度。0 表示如果位数不足则以 0 填充,# 表示只要有可能就把数字拉上这个位置。上面的例子包含了差不多所有的基本用法,如果你想了解更多,请参考 DecimalFormat 类的文档。

符号含义:

0 一个数字

‘#’ 一个数字,不包括 0

. 小数的分隔符的占位符

, 分组分隔符的占位符

; 分隔格式。

  • 缺省负数前缀。

% 乘以 100 和作为百分比显示

? 乘以 1000 和作为千进制货币符显示;用货币符号代替;如果双写,用 国际货币符号代替。如果出现在一个模式中,用货币十进制分隔符代 替十进制分隔符。

X 前缀或后缀中使用的任何其它字符,用来引用前缀或后缀中的特殊字符。

DecimalFormat df1 = new DecimalFormat("0.0"); 
DecimalFormat df2 = new DecimalFormat("#.#"); 
DecimalFormat df3 = new DecimalFormat("000.000"); 
DecimalFormat df4 = new DecimalFormat("###.###"); 

System.out.println(df1.format(12.34)); //12.3
System.out.println(df2.format(12.34)); //12.3
System.out.println(df3.format(12.34)); //012.340
System.out.println(df4.format(12.34)); //12.34

import java.text.DecimalFormat;
public class Test{



    public static void main(String[] args){
        
        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米

    }
}

文章出处登录后可见!

已经登录?立即刷新

共计人评分,平均

到目前为止还没有投票!成为第一位评论此文章。

(0)
xiaoxingxing的头像xiaoxingxing管理团队
上一篇 2023年12月12日
下一篇 2023年12月12日

相关推荐