日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

java格式化数字 NumberFormat及DecimalFormat

發(fā)布時(shí)間:2023/12/10 编程问答 45 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java格式化数字 NumberFormat及DecimalFormat 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

前言

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

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

正文

如果你對(duì)java源碼比較了解。你會(huì)發(fā)現(xiàn)java對(duì)文字,數(shù)字的格式化,是有一個(gè)公共的父類的Format
NumberFormat和DecimalFormat都是它的子類關(guān)于數(shù)字的
DateFormat和SimpleDateFormat也是它的子類關(guān)于文字的

當(dāng)然今天只說(shuō)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í)例,通過(guò)ThreadLocal 來(lái)給每個(gè)線程都產(chǎn)生一個(gè)本地實(shí)例。如果你對(duì)ThreadLocal不了解,可以看我這篇博客
    ThreadLocal 的用法以及內(nèi)存泄露(內(nèi)存溢出)
  • 進(jìn)行外部同步,這個(gè)就可以通過(guò)關(guān)鍵詞 synchronized來(lái)進(jìn)行同步。如果 你不了解synchronized,可以看我這篇博客synchronized 參數(shù) 及其含義
  • 上面的這兩種方法呢,
    第一種方法 **比較占用內(nèi)存多,但是速度快,效率高。并發(fā)。**第二種方法 **占用內(nèi)存少,效率低,耗費(fèi)時(shí)間長(zhǎng),畢竟要排隊(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ù)字格式的具體子類 。它具有多種功能,旨在解析和格式化任何語(yǔ)言環(huán)境中的數(shù)字,包括支持西方,阿拉伯語(yǔ)和印度語(yǔ)數(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來(lái)獲取貨幣數(shù)字格式。
  • 使用getPercentInstance獲取顯示百分比的格式。
  • 常用方法


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

    使用示例

    DecimalFormat是NumberFormat,所以,就不要單獨(dú)的為NumberFormat寫(xiě)一個(gè)完整的示例了。只寫(xiě)一下配合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ù)部分的,所以開(kāi)始 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 開(kāi)始 System.out.println(fieldPosition.getBeginIndex() + " " + fieldPosition.getEndIndex()); //切割字符串 System.out.println(stringBuffer.toString().substring(fieldPosition.getBeginIndex()));

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

    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);//寫(xiě)具體的代碼}} catch (Exception e) {e.printStackTrace();}

    設(shè)置Pattern

    DecimalFormat作為NumberFormat的具體實(shí)現(xiàn)子類,最大的特點(diǎn)就是 可以使用Pattern。來(lái)實(shí)現(xiàn)最大程度的對(duì)數(shù)據(jù)格式進(jìn)行定制。
    一個(gè)Pattern中的許多字符是按字面意思理解的;它們?cè)诮馕銎陂g匹配,在格式化期間輸出不變,就是字符在Pattern中 不影響最后的數(shù)字格式化另一方面,特殊字符代表其他字符、字符串或字符類。如果要以文字形式出現(xiàn)在前綴或后綴中,必須引用它們(除非另有說(shuō)明)。

    子類特有的方法

    因?yàn)閼?#xff0c;而且這玩意是在簡(jiǎn)單,大家就將就看個(gè)截圖吧。

    使用示例

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

    通用格式

    //創(chuàng)建一個(gè)默認(rèn)的通用格式NumberFormat numberFormat = NumberFormat.getInstance();DecimalFormat numberDecimalFormat;//捕捉異常,以防強(qiáng)制類型轉(zhuǎn)換出錯(cuò)try {//強(qiáng)制轉(zhuǎn)換成DecimalFormatnumberDecimalFormat = (DecimalFormat) numberFormat;//保留小數(shù)點(diǎn)后面三位,不足的補(bǔ)零,前面整數(shù)部分 每隔四位 ,用 “,” 符合隔開(kāi)numberDecimalFormat.applyPattern("#,####.000");//設(shè)置舍入模式 為DOWN,否則默認(rèn)的是HALF_EVENnumberDecimalFormat.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é)果

    獲取百分比格式

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

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

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

    貨幣格式

    //創(chuàng)建一個(gè)中國(guó)地區(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í)候 是1000currencyFormat.setMultiplier(100);System.out.println(currencyFormat.format(0.912345));} catch (Exception e) {e.printStackTrace();}

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

    整數(shù)格式

    因?yàn)樗芎?jiǎn)單,作用就是只解析 整數(shù)部分的。小數(shù)部分的會(huì)被舍入。
    例如 “3456.78”→3456(并且在索引6之后保留解析位置)

    如果有不懂的,可以關(guān)注我的公眾號(hào) “知我飯否” 向我留言。我會(huì)每天更新一些文章,有興趣的可以 微信 搜索"知我飯否" or 掃描我的 博客頭像

    總結(jié)

    以上是生活随笔為你收集整理的java格式化数字 NumberFormat及DecimalFormat的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。