一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

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

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

java格式化數(shù)字操作 NumberFormat及DecimalFormat

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

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

前言

以前用到要對(duì)數(shù)字格式的地方,都是直接到網(wǎng)上搜一下。拿過來能用就行。因?yàn)槠綍r(shí)用的不多。但是最近的項(xiàng)目對(duì)這個(gè)用的多了。網(wǎng)上拿來的不夠用了。自己看了java源碼把這方面惡補(bǔ)了。而且最近也好長時(shí)間沒有寫博客了。正好寫一篇拋磚引玉吧。

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

 

正文

如果你對(duì)java源碼比較了解。你會(huì)發(fā)現(xiàn)java對(duì)文字,數(shù)字的格式化,是有一個(gè)公共的父類的Format。

NumberFormat和DecimalFormat都是它的子類關(guān)于數(shù)字的。

DateFormat和SimpleDateFormat也是它的子類關(guān)于文字的。

當(dāng)然今天只說NumberFormat和DecimalFormat。相信我,當(dāng)你搞懂這兩個(gè)以后,那么DateFormat和SimpleDateFormat也是肯定會(huì)的。

首先,要特別注意的是 NumberFormat和DecimalFormat是線程不安全的。 這意味你如果同時(shí)有多個(gè)線程操作一個(gè)format實(shí)例對(duì)象,會(huì)出現(xiàn)意想不到的結(jié)果。

解決方法有兩個(gè):

  • 為每個(gè)線程都創(chuàng)建一個(gè) format實(shí)例,通過ThreadLocal 來給每個(gè)線程都產(chǎn)生一個(gè)本地實(shí)例。如果你對(duì)ThreadLocal不了解,可以看我這篇文章:ThreadLocal 的用法以及內(nèi)存泄露(內(nèi)存溢出)
  • 進(jìn)行外部同步,這個(gè)就可以通過關(guān)鍵詞 synchronized來進(jìn)行同步。如果 你不了解synchronized,可以看我這篇文章:synchronized 參數(shù) 及其含義

上面的這兩種方法呢,

第一種方法 **比較占用內(nèi)存多,但是速度快,效率高。并發(fā)。**第二種方法 **占用內(nèi)存少,效率低,耗費(fèi)時(shí)間長,畢竟要排隊(duì)嘛,串行。**具體取舍,看項(xiàng)目的情況。

 

JavaAPI官方描述

NumberFormat

NumberFormat幫助您格式化和解析任何區(qū)域設(shè)置的數(shù)字。您的代碼可以完全獨(dú)立于小數(shù)點(diǎn),千位分隔符的區(qū)域設(shè)置約定,甚至是使用的特定十進(jìn)制數(shù)字,或者數(shù)字格式是否為十進(jìn)制。

DecimalFormat

DecimalFormat是NumberFormat十進(jìn)制數(shù)字格式的具體子類 。它具有多種功能,旨在解析和格式化任何語言環(huán)境中的數(shù)字,包括支持西方,阿拉伯語和印度語數(shù)字。它還支持不同類型的數(shù)字,包括整數(shù)(123),定點(diǎn)數(shù)(123.4),科學(xué)記數(shù)法(1.23E4),百分比(12%)和貨幣金額(123美元)。所有這些都可以本地化。

 

NumberFormat

獲取NumberFormat實(shí)例

//創(chuàng)建 一個(gè)整數(shù)格式 地區(qū)用系統(tǒng)默認(rèn)的
NumberFormat integerNumber = NumberFormat.getIntegerInstance(Locale.getDefault());
  • 使用getInstance或getNumberInstance獲取正常的數(shù)字格式。
  • 使用getIntegerInstance得到的整數(shù)格式。
  • 使用getCurrencyInstance來獲取貨幣數(shù)字格式。
  • 使用getPercentInstance獲取顯示百分比的格式。

常用方法

java格式化數(shù)字操作 NumberFormat及DecimalFormat

由于API 的描述足夠詳細(xì),所以我就直接截圖上來了。

使用示例

DecimalFormat是NumberFormat,所以,就不要單獨(dú)的為NumberFormat寫一個(gè)完整的示例了。只寫一下配合FieldPosition怎么使用的示例:

NumberFormat numberFormat = NumberFormat.getInstance(Locale.getDefault());
//整數(shù)部分不會(huì)每隔三個(gè),就會(huì)有 " ,"
numberFormat.setGroupingUsed(false);
//線程安全的字符串緩沖類
StringBuffer stringBuffer = new StringBuffer();
//構(gòu)造參數(shù) 是Format子類里面的 自己特有的參數(shù),傳入就行
//構(gòu)造 小數(shù)部分的,所以開始 beginIndex()是從小數(shù)點(diǎn) 后面算的,  但是0是從整個(gè)格式化數(shù)字,第一個(gè)算起, 包括 之間用于分組的 " ,"
FieldPosition fieldPosition = new FieldPosition(NumberFormat.FRACTION_FIELD);
stringBuffer = numberFormat.format(1234.56789, stringBuffer, fieldPosition);
System.out.println(stringBuffer.toString());
//小數(shù)部分, 所以 從5 開始
System.out.println(fieldPosition.getBeginIndex() + "   " + fieldPosition.getEndIndex());
//切割字符串
System.out.println(stringBuffer.toString().substring(fieldPosition.getBeginIndex()));

運(yùn)行結(jié)果

java格式化數(shù)字操作 NumberFormat及DecimalFormat

 

DecimalFormat

獲取DecimalFormat實(shí)例

要獲取特定地區(qū)(包括默認(rèn)地區(qū))的NumberFormat,請(qǐng)調(diào)用NumberFormat的工廠方法之一,例如getInstance()。通常,不要直接調(diào)用DecimalFormat構(gòu)造函數(shù),因?yàn)镹umberFormat工廠方法可能返回DecimalFormat之外的子類。如果需要自定義format對(duì)象,可以這樣做:

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

設(shè)置Pattern

DecimalFormat作為NumberFormat的具體實(shí)現(xiàn)子類,最大的特點(diǎn)就是 可以使用Pattern。來實(shí)現(xiàn)最大程度的對(duì)數(shù)據(jù)格式進(jìn)行定制。

一個(gè)Pattern中的許多字符是按字面意思理解的;它們?cè)诮馕銎陂g匹配,在格式化期間輸出不變,就是字符在Pattern中 不影響最后的數(shù)字格式化另一方面,特殊字符代表其他字符、字符串或字符類。如果要以文字形式出現(xiàn)在前綴或后綴中,必須引用它們(除非另有說明)。

java格式化數(shù)字操作 NumberFormat及DecimalFormat

子類特有的方法

因?yàn)閼校疫@玩意是在簡單,大家就將就看個(gè)截圖吧。

java格式化數(shù)字操作 NumberFormat及DecimalFormat

使用示例

接下來就是萬眾矚目的示例代碼了,只要java基礎(chǔ)可以,一開始看這個(gè)完全就可以學(xué)會(huì)用法。

通用格式

      //創(chuàng)建一個(gè)默認(rèn)的通用格式
      NumberFormat numberFormat = NumberFormat.getInstance();
      DecimalFormat numberDecimalFormat;
      //捕捉異常,以防強(qiáng)制類型轉(zhuǎn)換出錯(cuò)
      try {
          //強(qiáng)制轉(zhuǎn)換成DecimalFormat
          numberDecimalFormat = (DecimalFormat) numberFormat;
          //保留小數(shù)點(diǎn)后面三位,不足的補(bǔ)零,前面整數(shù)部分 每隔四位 ,用 “,” 符合隔開
          numberDecimalFormat.applyPattern("#,####.000");
          //設(shè)置舍入模式 為DOWN,否則默認(rèn)的是HALF_EVEN
          numberDecimalFormat.setRoundingMode(RoundingMode.DOWN);
          //設(shè)置 要格式化的數(shù) 是正數(shù)的時(shí)候。前面加前綴
          numberDecimalFormat.setPositivePrefix("Prefix  ");
          System.out.println("正數(shù)前綴  "+numberDecimalFormat.format(123456.7891));
          //設(shè)置 要格式化的數(shù) 是正數(shù)的時(shí)候。后面加后綴
          numberDecimalFormat.setPositiveSuffix("  Suffix");
          System.out.println("正數(shù)后綴  "+numberDecimalFormat.format(123456.7891));
          //設(shè)置整數(shù)部分的最大位數(shù)
          numberDecimalFormat.setMaximumIntegerDigits(3);
          System.out.println("整數(shù)最大位數(shù) "+numberDecimalFormat.format(123456.7891));
          //設(shè)置整數(shù)部分最小位數(shù)
          numberDecimalFormat.setMinimumIntegerDigits(10);
          System.out.println("整數(shù)最小位數(shù) "+numberDecimalFormat.format(123456.7891));
          //設(shè)置小數(shù)部分的最大位數(shù)
          numberDecimalFormat.setMaximumFractionDigits(2);
          System.out.println("小數(shù)部分最大位數(shù) "+numberDecimalFormat.format(123.4));
          //設(shè)置小數(shù)部分的最小位數(shù)
          numberDecimalFormat.setMinimumFractionDigits(6);
          System.out.println("小數(shù)部分最小位數(shù) "+numberDecimalFormat.format(123.4));
      }catch (Exception e){
          e.printStackTrace();
      }

運(yùn)行結(jié)果

java格式化數(shù)字操作 NumberFormat及DecimalFormat

獲取百分比格式

對(duì)數(shù)字 進(jìn)行 百分比 格式化

      //創(chuàng)建一個(gè)中國地區(qū)的 百分比格式
      NumberFormat perFormat = NumberFormat.getPercentInstance(Locale.CHINA);
      DecimalFormat percentFormat;
      try {
          percentFormat = (DecimalFormat) perFormat;
          //設(shè)置Pattern 會(huì)使百分比格式,自帶格式失效
//            percentFormat.applyPattern("##.00");
          //設(shè)置小數(shù)部分 最小位數(shù)為2
          percentFormat.setMinimumFractionDigits(2);
          System.out.println(percentFormat.format(0.912345));
      } catch (Exception e) {
          e.printStackTrace();
      }

運(yùn)行結(jié)果:

java格式化數(shù)字操作 NumberFormat及DecimalFormat

貨幣格式

      //創(chuàng)建一個(gè)中國地區(qū)的 貨幣格式
      NumberFormat curFormat = NumberFormat.getCurrencyInstance(Locale.CHINA);
      DecimalFormat currencyFormat;
      try {
          currencyFormat = (DecimalFormat) curFormat;
          //設(shè)置Pattern 會(huì)使百分比格式,自帶格式失效
//            currencyFormat.applyPattern("##.00");
          System.out.println(currencyFormat.format(0.912345));
          //乘法 數(shù)乘以多少 這個(gè)方法是 百分比時(shí)候 設(shè)置成100   km時(shí)候 是1000
          currencyFormat.setMultiplier(100);
          System.out.println(currencyFormat.format(0.912345));
      } catch (Exception e) {
          e.printStackTrace();
      }

運(yùn)行結(jié)果:

java格式化數(shù)字操作 NumberFormat及DecimalFormat

整數(shù)格式

因?yàn)樗芎唵危饔镁褪侵唤馕?整數(shù)部分的。小數(shù)部分的會(huì)被舍入。

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

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持服務(wù)器之家。

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 无人区在线观看免费完整版免费 | 国产视频一区在线观看 | 韩国三级年轻小的胰子完整 | 精品久久久久久国产 | 亚洲无限观看 | 国产网站免费观看 | 99热久久这里只有精品23 | 国产精品nv在线观看 | 亚洲成人免费观看 | 日本久本草精品 | 欧美性野久久久久久久久 | 情侣宾馆愉拍自拍视频 | 精品日韩欧美一区二区三区 | 日韩在线一区二区 | 私人家庭影院5577 | 久久AV国产麻豆HD真实乱 | 农村脱精光一级 | 日韩免费毛片视频杨思敏 | 女性性色生活片免费观看 | 99爱免费视频 | china精品对白普通话 | 精品国产视频 | 7788理论片在线观看 | 日韩网站在线 | 国产精品污双胞胎在线观看 | 四虎一影院区永久精品 | 国产精品国产香蕉在线观看网 | 白丝美女同人18漫画 | 青柠在线完整高清观看免费 | 和肥岳在厨房激情 | 欧美久久久久久久一区二区三区 | 成人国产在线视频在线观看 | 国产成年人在线观看 | 五月婷婷在线播放 | 日韩天堂网| 久久不射电影网 | 深夜激情网 | 91啦在线视频 | 欧美久久一区二区三区 | 深夜在线| 欧洲另类一二三四区 |