java格式化数字操作 NumberFormat及DecimalFormat

目录
  • 前言
  • 正文
  • JavaAPI官方描述
    • NumberFormat
    • DecimalFormat
  • NumberFormat
    • 获取NumberFormat实例
    • 常用方法
    • 使用示例
  • DecimalFormat
    • 获取DecimalFormat实例
    • 设置Pattern
    • 子类特有的方法
    • 使用示例
    • 通用格式
    • 获取百分比格式
    • 货币格式
    • 整数格式

前言

以前用到要对数字格式的地方,都是直接到网上搜一下。拿过来能用就行。因为平时用的不多。但是最近的项目对这个用的多了。网上拿来的不够用了。自己看了java源码把这方面恶补了。而且最近也好长时间没有写博客了。正好写一篇抛砖引玉吧。

如果你只想知道怎么用,可以直接看下面使用示例↓↓↓。三分钟速成。

正文

如果你对java源码比较了解。你会发现java对文字,数字的格式化,是有一个公共的父类的Format。

NumberFormat和DecimalFormat都是它的子类关于数字的。

DateFormat和SimpleDateFormat也是它的子类关于文字的。

当然今天只说NumberFormat和DecimalFormat。相信我,当你搞懂这两个以后,那么DateFormat和SimpleDateFormat也是肯定会的。

首先,要特别注意的是 NumberFormat和DecimalFormat是线程不安全的。 这意味你如果同时有多个线程操作一个format实例对象,会出现意想不到的结果。

解决方法有两个:

  • 为每个线程都创建一个 format实例,通过ThreadLocal 来给每个线程都产生一个本地实例。如果你对ThreadLocal不了解,可以看我这篇文章:ThreadLocal 的用法以及内存泄露(内存溢出)
  • 进行外部同步,这个就可以通过关键词 synchronized来进行同步。如果 你不了解synchronized,可以看我这篇文章:synchronized 参数 及其含义

上面的这两种方法呢,

第一种方法 **比较占用内存多,但是速度快,效率高。并发。**第二种方法 **占用内存少,效率低,耗费时间长,毕竟要排队嘛,串行。**具体取舍,看项目的情况。

JavaAPI官方描述

NumberFormat

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

DecimalFormat

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

NumberFormat

获取NumberFormat实例

//创建 一个整数格式 地区用系统默认的
NumberFormat integerNumber = NumberFormat.getIntegerInstance(Locale.getDefault());
  • 使用getInstance或getNumberInstance获取正常的数字格式。
  • 使用getIntegerInstance得到的整数格式。
  • 使用getCurrencyInstance来获取货币数字格式。
  • 使用getPercentInstance获取显示百分比的格式。

常用方法

由于API 的描述足够详细,所以我就直接截图上来了。

使用示例

DecimalFormat是NumberFormat,所以,就不要单独的为NumberFormat写一个完整的示例了。只写一下配合FieldPosition怎么使用的示例:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
//整数部分不会每隔三个,就会有 " ,"
numberFormat.setGroupingUsed(false);
//线程安全的字符串缓冲类
StringBuffer stringBuffer = new StringBuffer();
//构造参数 是Format子类里面的 自己特有的参数,传入就行
//构造 小数部分的,所以开始 beginIndex()是从小数点 后面算的,  但是0是从整个格式化数字,第一个算起, 包括 之间用于分组的 " ,"
FieldPosition fieldPosition = new FieldPosition(NumberFormat.FRACTION_FIELD);
stringBuffer = numberFormat.format(1234.56789, stringBuffer, fieldPosition);
System.out.println(stringBuffer.toString());
//小数部分, 所以 从5 开始
System.out.println(fieldPosition.getBeginIndex() + "   " + fieldPosition.getEndIndex());
//切割字符串
System.out.println(stringBuffer.toString().substring(fieldPosition.getBeginIndex()));

运行结果

DecimalFormat

获取DecimalFormat实例

要获取特定地区(包括默认地区)的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中 不影响最后的数字格式化另一方面,特殊字符代表其他字符、字符串或字符类。如果要以文字形式出现在前缀或后缀中,必须引用它们(除非另有说明)。

子类特有的方法

因为懒,而且这玩意是在简单,大家就将就看个截图吧。

使用示例

接下来就是万众瞩目的示例代码了,只要java基础可以,一开始看这个完全就可以学会用法。

通用格式

        //创建一个默认的通用格式
        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();
        }

运行结果

获取百分比格式

对数字 进行 百分比 格式化

        //创建一个中国地区的 百分比格式
        NumberFormat perFormat = NumberFormat.getPercentInstance(Locale.CHINA);
        DecimalFormat percentFormat;
        try {
            percentFormat = (DecimalFormat) perFormat;
            //设置Pattern 会使百分比格式,自带格式失效
//            percentFormat.applyPattern("##.00");
            //设置小数部分 最小位数为2
            percentFormat.setMinimumFractionDigits(2);
            System.out.println(percentFormat.format(0.912345));
        } catch (Exception e) {
            e.printStackTrace();
        }

运行结果:

货币格式

        //创建一个中国地区的 货币格式
        NumberFormat curFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);
        DecimalFormat currencyFormat;
        try {
            currencyFormat = (DecimalFormat) curFormat;
            //设置Pattern 会使百分比格式,自带格式失效
//            currencyFormat.applyPattern("##.00");
            System.out.println(currencyFormat.format(0.912345));
            //乘法 数乘以多少 这个方法是 百分比时候 设置成100   km时候 是1000
            currencyFormat.setMultiplier(100);
            System.out.println(currencyFormat.format(0.912345));
        } catch (Exception e) {
            e.printStackTrace();
        }

运行结果:

整数格式

因为它很简单,作用就是只解析 整数部分的。小数部分的会被舍入。

例如 “3456.78”→3456(并且在索引6之后保留解析位置)

以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • java.text.DecimalFormat用法详解

    简要 DecimalFormat 的 pattern 都包含着 正负子 pattern ,例如 "#,##0.00;(#,##0.00)": /** * Created by Shuai on 2016/7/11. */ public class Main { public static void main(String[] args) { // 正值 BigDecimal bigDecimal = BigDecimal.valueOf(-12211151515151.541666);

  • DecimalFormat多种用法详解

    NumberFormat.getInstance()方法返回NumberFormat的一个实例(实际上是NumberFormat具体的一个子类,例如DecimalFormat), 这适合根据本地设置格式化一个数字.你也可以使用非缺省的地区设置,例如德国.然后格式化方法根据特定的地区规则格式化数字.这个程序也可以使用一个简单的形式: NumberFormat.getInstance().format(1234.56) 但是保存一个格式然后重用更加有效.国际化是格式化数字时的一个大问题. 另一个是对

  • java.text.DecimalFormat类十进制格式化

    java.text.DecimalFormat类十进制格式化的具体代码,供大家参考,具体内容如下 import java.text.DecimalFormat; class FormatDemo{ public void format1(String pattern,double value){ // 声明一个DecimalFormat对象 DecimalFormat df = new DecimalFormat(pattern); String str = df.format(value);

  • 聊聊DecimalFormat的用法及各符号的意义

    目录 DecimalFormat的用法及各符号的意义 使用DecimalFormat时注意事项 总结一下吧 DecimalFormat的用法及各符号的意义 符号 位置 本地化? 含义 0 数字 是 阿拉伯数字 # 数字字 是 阿拉伯数字,如果不存在则显示为空 . 数字 是 小数分隔符或货币小数分隔符 - 数字 是 减号 , 数字 是 分组分隔符 E 数字 是 分隔科学计数法中的尾数和指数.在前缀或后缀中无需加引号. ; 子模式边界 是 分隔正数和负数子模式 % 前缀或后缀 是 乘以 100 并显

  • Java中DecimalFormat用法详解

    我们经常要将数字进行格式化,比如取2位小数,这是最常见的.Java 提供DecimalFormat类,帮你用最快的速度将数字格式化为你需要的样子.下面是一个例子: importjava.text.DecimalFormat; public class TestNumberFormat{ public static void main(String[]args){ doublepi=3.1415927; //圆周率 //取一位整数 System.out.println(newDecimalForm

  • java中DecimalFormat四舍五入用法详解

    DecimalFormat 是 NumberFormat 的一个具体子类,用于格式化十进制数字.它可以支持不同类型的数,包括整数 (123).定点数 (123.4).科学记数法表示的数 (1.23E4).百分数 (12%) 和金额 ($123)这些内容的本地化. 下边先介绍下DecimalFormat的用法: import java.text.*; import java.util.*; public class DecimalFormatDemo { public static void ma

  • java格式化数字操作 NumberFormat及DecimalFormat

    目录 前言 正文 JavaAPI官方描述 NumberFormat DecimalFormat NumberFormat 获取NumberFormat实例 常用方法 使用示例 DecimalFormat 获取DecimalFormat实例 设置Pattern 子类特有的方法 使用示例 通用格式 获取百分比格式 货币格式 整数格式 前言 以前用到要对数字格式的地方,都是直接到网上搜一下.拿过来能用就行.因为平时用的不多.但是最近的项目对这个用的多了.网上拿来的不够用了.自己看了java源码把这方面

  • java 格式化输出数字的方法

    主要使用的类:java.text.DecimalFormat 1.实例化对象,可以用如下两种方法: 复制代码 代码如下: DecimalFormat df=(DecimalFormat)NumberFormat.getInstance(); DecimalFormat df1=(DecimalFormat) DecimalFormat.getInstance(); 因为DecimalFormat继承自NumberFormat. 2.设定小数位数 系统默认小数位数为3,如: 复制代码 代码如下:

  • Java实现多线程轮流打印1-100的数字操作

    首先打印1-100数字如果用一个单线程实现那么只要一个for循环即可,那么如果要用两个线程打印出来呢?(一个线程打印奇数,一个线程打印偶数)于是大家会想到可以通过加锁实现,但是这样的效率是不是不高?这里我用一个变量来控制两个线程的输出 public class ThreadTest { volatile int flag=0; public void runThread() throws InterruptedException{ Thread t1=new Thread(new Thread1

  • Java 格式化输出JSON字符串的2种实现操作

    1 使用阿里的FastJson 1.1 项目的pom.xml依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.58</version> </dependency> 1.2 Java示例代码 (1) 导入的包: com.alibaba.fastjson.JSON; import

  • php 格式化数字的时候注意数字的范围

    构造sql语句是 比起来 复制代码 代码如下: $sql = 'SELECT * FROM sdb_comments WHERE goods_id = '.intval($goods_id).' AND for_comment_id IS NULL AND object_type = ".$item." AND disabled="false" AND display = "true"'; 我更喜欢这样做: 复制代码 代码如下: $sql = s

  • JavaScript 格式化数字、金额、千分位、保留几位小数、舍入舍去

    前端开发中经常会碰到用 JavaScript?格式化数字,最最常见的是格式化金额,一般格式化金额需要千分位分隔,保留2位小数等等. 简单的功能函数 类似的代码网上有很多: /** * 将数值四舍五入(保留2位小数)后格式化成金额形式 * * @param num 数值(Number或者String) * @return 金额格式的字符串,如'1,234,567.45' * @type String */ function formatCurrency(num) { num = num.toStr

  • js实现的格式化数字和金额功能简单示例

    本文实例讲述了js实现的格式化数字和金额功能.分享给大家供大家参考,具体如下: 格式化数字,格式化金额: function number_format(number, decimals, dec_point, thousands_sep) { /* * 参数说明: * number:要格式化的数字 * decimals:保留几位小数 * dec_point:小数点符号 * thousands_sep:千分位符号 * */ number = (number + '').replace(/[^0-9

  • AngularJS日期格式化常见操作实例分析

    本文实例讲述了AngularJS日期格式化常见操作.分享给大家供大家参考,具体如下: <!DOCTYPE html> <html ng-app="myApp"> <head lang="en"> <meta charset="UTF-8"> <title>www.jb51.net AngularJS日期格式化</title> <script src="http

  • C#格式化数字字符串的方法

    本文实例为大家分享了C#格式化数字字符串的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace _2018_05_04_AM_1520_格式化数字字符串 { class Program { static void Main(string[] args) { /* *

  • Java使用JSONObject操作json实例解析

    本文实例讲述了Java使用JSONObject操作json.分享给大家供大家参考,具体如下: 简介 在程序开发过程中,在参数传递,函数返回值等方面,越来越多的使用JSON.JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,同时也易于机器解析和生成.易于理解.阅读和撰写,而且Json采用完全独立于语言的文本格式,这使得Json成为理想的数据交换语言.  JSON建构于两种结构: "名称/值"对的集合(A Collection of name/va

随机推荐