java 格式化 布尔型_这么久才知道Java中的format很强大!
Java中允許我們對指定的對象進行某種格式化,從而得到我們想要的格式化樣式。
Format
首先介紹java.text包中的Format
Foramt是一個抽象基類,其具體子類必須實現(xiàn)
format(Object?obj,?StringBuffer?toAppendTo,?FieldPosition?pos)
和
parseObject(String?source,?ParsePosition?pos)
兩個抽象方法。
format方法用于將對象格式化為指定模式的字符串
parseObject方法用于將字符串重新解析為對象
Format的直接子類包括DateFormat、NumberFormat和MessageFormat。下面一一進行介紹
1.DateFormat
DateFormat根據(jù)當(dāng)前語言環(huán)境格式化日期和時間。
DateFormat是一個抽象類,所以不能直接new創(chuàng)建實例對象。但該類為我們提供了工廠方法方便我們使用。
1.getDateInstance()方法,獲取格式化的日期,輸出樣式:2015-12-102.getDateTimeInstance()方法,獲取格式化的日期和時間,輸出樣式:2015-12-10?10:21:413.getTimeInstance()方法,獲取格式化的時間,輸出樣式:10:21:414.getInstance()方法,獲取格式化的日期和時間,輸出樣式:15-12-10?上午10:21
也許你會發(fā)現(xiàn),在這些工廠發(fā)放中允許我們傳入一個int參數(shù),該參數(shù)允許我們設(shè)定格式化風(fēng)格,從而得到我們相對理想的結(jié)果。下表中對應(yīng)了不同的style值和輸出樣式(這些常量值都在DateFormat類中)樣式值日期時間SHORT15-12-10上午10:08
MEDIUM2015-12-1010:09:23
LONG2015年12月10日上午10時09分40秒
FULL2015年12月10日 星期四上午10時17分30秒 CST
DEFAULT2015-12-1010:18:07
當(dāng)然你也可以指定語言環(huán)境獲取該語言環(huán)境下的格式化日期和時間,
DateFormat?format?=?DateFormat.getDateInstance(DateFormat.DEFAULT,Locale.CANADA);//獲取加拿大的格式化日期
也許你要發(fā)問了,上面的格式?jīng)]有我一個想要的啊。那好,這里還有一個好東西SimpleDateFormat
SimpleDateFormat是DateFormat的一個具體類,它允許我們指定格式模式從而獲取我們理想的格式化日期和時間。
通過SimpleDateFormat的構(gòu)造方法你可以傳入一個格式模式字符串或者通過applyPattern(String pattern)方法添加一個格式模式字符串。
對于格式模式字符串,API為我們提供了豐富的模式元素,下面列出幾個常用的模式元素字母日期或時間元素示例y年2015
M年中的月份12
w年中的周數(shù)50
W月份中的周數(shù)02
D年中的天數(shù)344
d月份中的天數(shù)10
F月份中的星期02
E星期中的天數(shù)星期四、Thu
aAM/PM標記下午、PM
H一天中的小時數(shù)(0~23)21
k一天中的小時數(shù)(1~24)21
Kam/pm中的小時數(shù)(0~11)09
ham/pm中的小時數(shù)(1~12)09
m小時中的分鐘數(shù)31
s分鐘中的秒數(shù)08
S毫秒數(shù)716
如果你設(shè)置Locale的話,會有不同的顯示格式,比如如果設(shè)置Locale.ENGLISH,E會顯示為英文格式,a顯示為AM或PM
Date?date?=?new?Date();SimpleDateFormat?format?=?new?SimpleDateFormat("今天是yyyy-MM-dd?E?hh:mm:ss,是yyyy年的第DD天,在該月是第dd天");System.out.println(format.format(date));將會輸出:今天是2015-12-10 星期四 09:38:16,是2015年的第344天,在該月是第10天
2.NumberFormat
NumberFormat根據(jù)當(dāng)前語言環(huán)境格式化數(shù)字
NumberFormat同樣是一個抽象基類,可以使用API中的工廠方法獲取實例對象
1.getCurrencyInstance()方法,根據(jù)當(dāng)前語言環(huán)境獲取貨幣數(shù)值格式。傳遞Locale對象可以獲取指定語言環(huán)境下的貨幣數(shù)值格式,比如
NumberFormat?format?=?NumberFormat.getCurrencyInstance(Locale.CANADA);System.out.println(format.format(439.6));
將會輸出:$439.60
2.getInstance()和getNumberInstance()方法都會獲取到常規(guī)數(shù)值格式
3.getIntegerInstance()方法獲取常規(guī)整數(shù)值格式,如果需要格式化的數(shù)值為小數(shù),則會將數(shù)值四舍五入為最接近的整數(shù)
4.getPercentInstance()方法獲取百分比的數(shù)值格式
NumberFormat有兩個具體實現(xiàn)子類DecimalFormat和ChoiceFormatDecimalFormat
DecimalFormat同SimpleDateFormat類似,允許我們指定格式模式獲取我們想要的格式化數(shù)值
DecimalFormat類對于數(shù)值的小數(shù)部分,默認顯示3位小數(shù),在去掉超出小數(shù)點后面3位的部分時,會將數(shù)值四舍五入為最接近的數(shù)值格式化輸出。淡然我們可以對這個默認進行設(shè)置
setMaximumFractionDigits(int newValue)方法,設(shè)置小數(shù)部分中允許的最大數(shù)字位數(shù)
setMinimumFractionDigits(int newValue)方法,設(shè)置小數(shù)部分中允許的最小數(shù)字位數(shù),如果原數(shù)小數(shù)位數(shù)不夠的話,會補零。
對于數(shù)值的整數(shù)部分,默認3個數(shù)字為一組進行顯示,同樣對此我們也可以自定義,使用setGroupingSize(int i)方法,設(shè)置分組中一組的位數(shù)。
setGroupingUsed(boolean value)方法設(shè)置是否使用分組,true表示使用,false表示取消分組
setMaximumIntegerDigits(int newValue)方法設(shè)置整數(shù)部分允許的最大數(shù)字位數(shù)
setMinimumIntegerDigits(int newValue)方法設(shè)置整數(shù)部分允許的最小數(shù)字位數(shù)
在````的構(gòu)造方法中,允許我們傳入格式模式字符串輸出我們想要的格式化數(shù)值,格式模式元素包含如下
||
----|------------|------
0 | 表示一個數(shù)字,被格式化數(shù)值不夠的位數(shù)會補0
| 表示一個數(shù)字,被格式化數(shù)值不夠的位數(shù)會忽略
. | 小數(shù)點分隔符的占位符
, | 分組分隔符的占位符| 缺省負數(shù)前綴
% | 將數(shù)值乘以100并顯示為百分數(shù)
\u2030 | 將數(shù)值乘以1000并顯示為千分數(shù)
再次
DecimalFormat?format1?=?new?DecimalFormat("#\u2030");System.out.println(format1.format(0.3345));//輸出334‰?DecimalFormat?format2?=?new?DecimalFormat("##.##");System.out.println(format2.format(12.345));//輸出12.35?DecimalFormat?format3?=?new?DecimalFormat("0000.00");System.out.println(format3.format(12.345));//輸出0012.35?DecimalFormat?format4?=?new?DecimalFormat("#.##%");System.out.println(format4.format(12.345));//輸出1234.5%ChoiceFormat
ChoiceFormat允許將格式化運用到某個范圍的數(shù),通常與MessageFormat一同使用。ChoiceFormat在構(gòu)造方法中接收一個format數(shù)組和一個limits數(shù)組,這兩個數(shù)組的長度必須相等,例如:
limits?=?{1,2,3,4,5,6,7}formats?=?{"Sun","Mon","Tue","Wed","Thur","Fri","Sat"}
limits數(shù)組實際上是個區(qū)間,可開可閉,并且必須按升序排列,如果不按升序排列,格式化結(jié)果將會不正確,還可以使用\u221E(表示無窮大)。
ChoiceFormat的匹配公式limit[j] <= X
其中X表示使用format方法傳入的值,j表示limit數(shù)組中的索引。當(dāng)且僅當(dāng)上述公式成立時,X匹配j,如果不能匹配,則會根據(jù)X是太小還是太大,匹配limits數(shù)組的第一個索引或最后一個索引,然后使用匹配的limits數(shù)組中的索引,去formats數(shù)組中尋找相同索引的值。例子:
double[]?limits?=?{?3,?4,?5,?6,?7,?8,?9?};String[]?formats?=?{?"星期一",?"星期二",?"星期三",?"星期四",?"星期五",?"星期六",?"星期日"?};ChoiceFormat?format?=?new?ChoiceFormat(limits,?formats);System.out.println(format.format(2.5));//將會輸出"星期一"/**3.6介于3和4之間,所以會匹配3,又由于3在limits數(shù)組中的索引是0,所以會在formats數(shù)組徐照索引0的值,即輸出"星期一"*/System.out.println(format.format(3.6));
下面看一下ChoiceFormat類中的幾個常用方法
1.nextDouble(double d)靜態(tài)方法查找大于d的最小double值,用在limits數(shù)組中,從而使limits數(shù)組形成一個右開區(qū)間數(shù)組,例如
limits = {0,1,ChoiceFormat.nextDouble(1)}
2.nextDouble(double d, boolean positive)靜態(tài)方法,如果positive參數(shù)為true,表示查找大于d的最小double值;如果positive參數(shù)為false,表示查找小于d的最大double值,這樣就可以使limits形成一個左開區(qū)間數(shù)組。
3.previousDouble(double d)靜態(tài)方法,查找小于d的最大double值
ChoiceFormat類的構(gòu)造方法也允許我們傳入一個模式字符串,format方法會根據(jù)這個模式字符串執(zhí)行格式化操作。一個模式元素的格式如下:doubleNum [占位符] formatStr
占位符可以使用#、< ?、\u2264(<=)
ChoiceFormat?cf?=?new?ChoiceFormat("1#is?1?|?1
由上面的例子可以看出,模式字符串中的每個模式元素之間使用"|"分割,"|"前后可以添加空格以美化代碼,而且必須按照升序進行書寫,否則會出現(xiàn)java.lang.IllegalArgumentException的運行時異常。
觀看ChoiceFormat類的源碼我們得知,實際上在內(nèi)部,模式字符串還是被轉(zhuǎn)換為limits和formats兩個數(shù)組。在源碼中
public ChoiceFormat(String newPattern) ?{applyPattern(newPattern);}/** applyPattern(newPattern)方法的部分源碼*/public void applyPattern(String newPattern) {...choiceLimits = new double[count];System.arraycopy(newChoiceLimits, 0, choiceLimits, 0, count);choiceFormats = new String[count];System.arraycopy(newChoiceFormats, 0, choiceFormats, 0, count);...}
可以看出ChoiceFormat(String newPattern)調(diào)用了applyPattern(String newPattern)方法,在applyPattern方法中對newPattern字符串進行解析,然后將解析后的數(shù)據(jù)放置到ChoiceFormat類的兩個私有屬性double[] choiceLimits和String[] choiceFormats中,然后使用格式化方法即可。
3.MessageFormat
MessageFormat提供了以語言環(huán)境無關(guān)的生成連接消息的方式。
常用MessageFormat的靜態(tài)方法format,該方法接收一個字符串的模式和一組對象(對象數(shù)組),按照模式形式將格式化的對象插入到模式中,然后返回字符串結(jié)果。
MessageFormat的格式模式元素(FormatElement)形式如下:
{ArgumentIndex}
{ArgumentIndex,FormatType}
{ArgumentIndex,FormatType,FormatStyle}
其中ArgumentIndex對象數(shù)組中的索引,從0開始,
FormatType包括number、date、 time、choice,
FormatStyle包括short、medium、long、full、integer、currency、percent、SubformatPattern(子模式),
在MessageFormat類的內(nèi)部,FormatType和FormatStyle實際上是創(chuàng)建格式元素的Format示例
number對應(yīng)了NumberFormat,其子格式對應(yīng)了DecimalFormat
date和time對應(yīng)了DateFormat,其資格是對應(yīng)了SimpleDateFormat
choice對應(yīng)了ChoiceFormat
敢說沒有意思,來多舉幾個栗子:
你可以直接使用MessageFormat類中的靜態(tài)方法format,像這樣:
/**這是源碼注釋中的一個例子*?在這個例子中靜態(tài)方法format第一個參數(shù)是字符串類型的,*?即模式字符串,第二個參數(shù)是個可變參數(shù),實際上就是一個Object類型的數(shù)組。*?在模式字符串中使用"{}"標識一個FormatElement。"{}"中的ArgumentIndex對應(yīng)Object數(shù)組中響應(yīng)索引處的值。*/int?planet?=?7;String?event?=?"a?disturbance?in?the?Force";String?result?=?MessageFormat.format("At?{1,time}?on?{1,date},?there?was?{2}?on?planet?{0,number,integer}.",??????????????????planet,?new?Date(),?event);System.out.println(result);
//輸出:At 20:39:15 on 2015-12-11, there was a disturbance in the Force on planet 7.
你也可以使用MessageFormat的構(gòu)造方法傳入pattern string(模式字符串),然后調(diào)用普通的format方法,在這里就不舉栗子了。
我們不僅被允許使用MessageFormat類中提供默認的FormatElement去format這些對象,還可以設(shè)置自己的Format對象format這些Object。
/**在這個例子中,MessageFormat和ChoiceFormat被結(jié)合使用*?MessageFormat類中有3個方法值的我們關(guān)注*?1.setFormatByArgumentIndex(int?argumentIndex,?Format?newFormat)//*?2.setFormats(Format[]?newFormats)*?3.setFormat(int?formatElementIndex,?Format?newFormat)*?在這個例子當(dāng)中,在MessageFormat的模式字符串的FormatElement(即{}中的內(nèi)容)中*?索引為0的地方將使用ChoiceFormat的格式去格式化。*?如果在set的Format中仍具有FormatElement,則會遞歸調(diào)用MessageFormat的format方法。*/MessageFormat?form?=?new?MessageFormat("The?disk?\"{1}\"?contains?{0}.");double[]?filelimits?=?{?0,?1,?2?};String[]?filepart?=?{?"no?files",?"one?file",?"{0,number}?files"?};ChoiceFormat?fileform?=?new?ChoiceFormat(filelimits,?filepart);form.setFormatByArgumentIndex(0,?fileform);int?fileCount?=?1273;String?diskName?=?"MyDisk";Object[]?testArgs?=?{?new?Long(fileCount),?diskName?};System.out.println(form.format(testArgs));//輸出:The?disk?"MyDisk"?contains?1,273?files.
4.String類中的format方法
format方法使用占位符進行格式化
常規(guī)類型、字符類型和數(shù)值類型的占位符格式:
%[index$][標識][最小寬度][.精度]轉(zhuǎn)換符
日期和時間類型的占位符格式:
%[index$][標識][最小寬度]轉(zhuǎn)換符
與參數(shù)不對應(yīng)的占位符格式:
%[標識][最小寬度]轉(zhuǎn)換符
其中index表示參數(shù)列表中的位置上的值
可用標識:標識含義-在最小寬度內(nèi)左對齊,不可與0標識一起使用
0若內(nèi)容長度不足最小寬度,則在左邊用0來填充
#對8進制和16進制,8進制前添加一個0,16進制前添加0x
+結(jié)果總包含一個+或-號
空格正數(shù)前加空格,負數(shù)前加-號
,只用與十進制,每3位數(shù)字間用,分隔
(若結(jié)果為負數(shù),則用括號括住,且不顯示符號
可用轉(zhuǎn)換符:轉(zhuǎn)換符含義b布爾類型,只要實參為非false的布爾類型,均格式化為字符串true,否則為字符串false
n平臺獨立的換行符, 也可通過System.getProperty("line.separator")獲取
f浮點數(shù)型(十進制)。顯示9位有效數(shù)字,且會進行四舍五入。如99.99
a浮點數(shù)型(十六進制)
e指數(shù)類型。如9.38e+5
g浮點數(shù)型(比%f,%a長度短些,顯示6位有效數(shù)字,且會進行四舍五入)
s字符串類型
c字符類型
String?result1?=?String.format("小明今年%d歲,他住在%s,他的月工資有%.2f",?25,"北京市",6633.435);System.out.println(result1);//輸出:小明今年25歲,他住在北京市,他的月工資有6633.44/*****************************************************/double?num?=?123.4567899;String?result2?=?String.format("%e",?num);System.out.println(result2);//輸出:1.234568e+02
總結(jié)
1.Format中的子類都是不同步,所以需要注意線程安全問題
2.可能在某些地方我解釋的還是不太清楚。學(xué)習(xí)最重要的是多去嘗試,多編寫代碼測試,如果僅僅靠看就能學(xué)會的話,那你就看吧、
總結(jié)
以上是生活随笔為你收集整理的java 格式化 布尔型_这么久才知道Java中的format很强大!的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【Pytorch神经网络实战案例】17
- 下一篇: linux as5 启动mysql_Re