激情久久久_欧美视频区_成人av免费_不卡视频一二三区_欧美精品在欧美一区二区少妇_欧美一区二区三区的

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - java格式化數字操作 NumberFormat及DecimalFormat

java格式化數字操作 NumberFormat及DecimalFormat

2022-02-15 16:15知我飯否 Java教程

這篇文章主要介紹了java格式化數字操作 NumberFormat及DecimalFormat,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教

前言

以前用到要對數字格式的地方,都是直接到網上搜一下。拿過來能用就行。因為平時用的不多。但是最近的項目對這個用的多了。網上拿來的不夠用了。自己看了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獲取顯示百分比的格式。

常用方法

java格式化數字操作 NumberFormat及DecimalFormat

由于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()));

運行結果

java格式化數字操作 NumberFormat及DecimalFormat

 

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及DecimalFormat

子類特有的方法

因為懶,而且這玩意是在簡單,大家就將就看個截圖吧。

java格式化數字操作 NumberFormat及DecimalFormat

使用示例

接下來就是萬眾矚目的示例代碼了,只要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();
      }

運行結果

java格式化數字操作 NumberFormat及DecimalFormat

獲取百分比格式

對數字 進行 百分比 格式化

      //創建一個中國地區的 百分比格式
      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();
      }

運行結果:

java格式化數字操作 NumberFormat及DecimalFormat

貨幣格式

      //創建一個中國地區的 貨幣格式
      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();
      }

運行結果:

java格式化數字操作 NumberFormat及DecimalFormat

整數格式

因為它很簡單,作用就是只解析 整數部分的。小數部分的會被舍入。

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

以上為個人經驗,希望能給大家一個參考,也希望大家多多支持服務器之家。

原文鏈接:https://blog.csdn.net/a1064072510/article/details/89887633

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 日本在线视频免费 | 国产成人综合在线 | hd porn 4k video xhicial| 手机黄色小视频 | 久久久成人免费视频 | 99欧美视频 | 素人视频免费观看 | 精品国产一区二区三区四 | 在线 日本 制服 中文 欧美 | 一区视频 | 成人做爰s片免费看网站 | 毛片一级网站 | chinese-xvideos| 精品国产一区二区三区四 | 成人三级电影在线 | 国产一级一级片 | 欧美一区二区三区中文字幕 | 九九热精品在线播放 | 免费黄网站在线播放 | 欧美一级在线免费 | 视频毛片 | 91久久国产综合精品女同国语 | 91成人影库 | 亚洲第一精品在线 | 黄色网址免费入口 | 精国产品一区二区三区 | 成年人免费黄色片 | 五月激情久久 | 日韩av一区二区三区在线观看 | 久久国语对白 | 国产欧美日韩在线播放 | 久草在线观看首页 | 欧产日产国产精品乱噜噜 | 成人福利免费在线观看 | 久久最新网址 | 欧美日韩一区,二区,三区,久久精品 | 一区二区三区四区精品 | 国语自产免费精品视频在 | 亚洲网视频 | 欧美成人高清视频 | 久在线观看福利视频69 |