一:格式化相關類
(一)java.text包java.text.Format的子類
–NumberFormat:數字格式化,抽象類 DecimalFormat –MessageFormat:字符串格式化 –DateFormat:日期/時間格式化,抽象類 SimpleDateFormat
(二)java.time.format包下
–DateTimeFormatter
二:相關類的使用
(一)NumberFormat的使用

NumberFormat nf = NumberFormat.getInstance(); System.out.println(nf.format(100000)); String name="100000"; try { System.out.println(nf.parse(name)); }catch(Exception e){ System.out.println(e.getMessage()); }
100,000 100000
NumberFormat nf = NumberFormat.getCurrencyInstance(); ¥100,000.00

String name="100d000"; try { System.out.println(nf.parse(name)); }catch(Exception e){ System.out.println(e.getMessage()); }
100
String name="d100000"; try { System.out.println(nf.parse(name)); }catch(Exception e){ System.out.println(e.getMessage()); }
Unparseable number: "d100000"
(二)DecimalFormat的使用

DecimalFormat df1,df2; System.out.println("整數部分為0的情況,0/#的區別"); // 整數部分為0 , #認為整數不存在,可不寫; 0認為沒有,但至少寫一位,寫0 df1 = new DecimalFormat("#.00"); df2 = new DecimalFormat("0.00"); System.out.println(df1.format(0.1)); // .10 System.out.println(df2.format(0.1)); // 0.10 System.out.println("小數部分0/#的區別"); //#代表最多有幾位,0代表必須有且只能有幾位,同C中的域寬,當域寬小於整數部分,整數部分會失效,全部顯示 df1 = new DecimalFormat("0.00"); df2 = new DecimalFormat("0.##"); System.out.println(df1.format(0.1)); // 0.10 System.out.println(df2.format(0.1)); // 0.1 System.out.println(df1.format(0.006)); // 0.01 System.out.println(df2.format(0.006)); // 0.01 System.out.println("整數部分有多位"); //0和#對整數部分多位時的處理是一致的 就是有幾位寫多少位 df1 = new DecimalFormat("0.00"); df2 = new DecimalFormat("#.00"); System.out.println(df1.format(2)); // 2.00 System.out.println(df2.format(2)); // 2.00 System.out.println(df1.format(20)); // 20.00 System.out.println(df2.format(20)); // 20.00 System.out.println(df1.format(200)); // 200.00 System.out.println(df2.format(200)); // 200.00
整數部分為0的情況,0/#的區別 .10 0.10 小數部分0/#的區別 0.10 0.1 0.01 0.01 整數部分有多位 2.00 2.00 20.00 20.00 200.00 200.00
df1 = new DecimalFormat("0.00"); df2 = new DecimalFormat("0.##"); System.out.println(df1.format(10.1)); // 0.10 System.out.println(df2.format(10.1)); // 0.1
10.10 10.1
(三)MessageFormat的使用(字符串格式化)
–支持多個參數-值對位復制文本
–支持變量的自定義格式
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); //planet對應0處,new Date()對應1,event對應2 System.out.println(result);
At 下午3:52:37 on 2019年1月3日, there was a disturbance in the Force on planet 7.
int fileCount = 1273; String diskName = "MyDisk"; Object[] testArgs = {new Long(fileCount), diskName}; MessageFormat form = new MessageFormat( "The disk \"{1}\" contains {0} file(s)."); //\轉義 System.out.println(form.format(testArgs));
The disk "MyDisk" contains 1,273 file(s).
MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}"); Object[] objs = {new Double(3.1415)}; String result = mf.format( objs ); System.out.println(result);
3.14, 3.1
String message = "{0}{1}{2}{3}{4}{5}{6}{7}{8}{9}{10}{11}{12}{13}{14}{15}{16}"; Object[] array = new Object[]{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q"}; String value = MessageFormat.format(message, array); System.out.println(value); message = "oh, {0,number,#.##} is a good number"; array = new Object[]{new Double(3.1415)}; value = MessageFormat.format(message, array); System.out.println(value);
ABCDEFGHIJKLMNOPQ oh, 3.14 is a good number
parse的使用(重點):按照格式解析字符串,返回數組對象
MessageFormat mf = new MessageFormat("{0,number,#.##}, {0,number,#.#}"); Object[] objs = {new Double(3.1415)}; String result = mf.format( objs ); // result now equals "3.14, 3.1" objs = null; objs = mf.parse(result, new ParsePosition(0)); for(int i=0;i<objs.length;i++) { System.out.println(objs[i]); }
3.1
ParsePosition設置訪問起始下標,0表示從{0}開始全部獲取,1表示從{1}開始索引,但是順序不變0,1,...
MessageFormat mf2 = new MessageFormat("{0}, {2}, {1}"); String forParsing = "x, y, z"; Object[] obj2 = mf2.parse(forParsing, new ParsePosition(0)); // result now equals {new String("z")} for(int i=0;i<obj2.length;i++) { System.out.println(obj2[i]); }
x
z
y
(四)DateFormat的使用(時間格式化,抽象類)
–SimpleDateFormat 工廠模式
–parse:將字符串格式化為時間對象
–format:將時間對象格式化為字符串
–如將當前時間轉為化YYYY-MM-DD HH24:MI:SS
String strDate = "2008-10-19 10:11:30.345" ; // 准備第一個模板,從字符串中提取出日期數字 String pat1 = "yyyy-MM-dd HH:mm:ss.SSS" ; // 准備第二個模板,將提取后的日期數字變為指定的格式 String pat2 = "yyyy年MM月dd日 HH時mm分ss秒SSS毫秒" ; SimpleDateFormat sdf1 = new SimpleDateFormat(pat1) ; // 實例化模板對象 SimpleDateFormat sdf2 = new SimpleDateFormat(pat2) ; // 實例化模板對象 Date d = null ; try{ d = sdf1.parse(strDate) ; // 將給定的字符串中的日期提取出來 }catch(Exception e){ // 如果提供的字符串格式有錯誤,則進行異常處理 e.printStackTrace() ; // 打印異常信息 } System.out.println(sdf2.format(d)) ; // 將日期變為新的格式
–parse:將字符串格式化為時間對象 –format:將時間對象格式化為字符串
三:格式化練習
(一)驗證身份證號碼是否正確
輸入一個字符串,請判斷是否滿足身份證基本要求,並返回具體的生日yyyy-mm-dd。如果輸入數據有誤,請輸出0000-00-00。基本要求是:
a)必須是18位;
b) 前面位數必須是數字,最后一位可以是數字或小寫字母;
c) 日期是存在的。
輸入格式: 一個身份證號碼,18位字符串 輸出格式: yyyy-mm-dd 輸入樣例: 53010219200508011x 輸出樣例: 1920-05-08
import java.text.*; import java.util.*; public class ClasslibTest { public static int judge(String iden) { if(iden.length() != 18) { return -1; } int i=0; int flag = 1; for(i=0;i<iden.length()-1;i++) { if(!(iden.charAt(i)>='0'&&iden.charAt(i)<='9')) { flag=0; break; } } if(!((iden.charAt(i)>='0'&&iden.charAt(i)<='9')||(iden.charAt(i)>='a'&&iden.charAt(i)<='z'))) { flag=0; } if(flag==0) { return -2; } return flag; } public static String getDate(String iden) { String sub=iden.substring(6, 14); return sub; } public static void main(String[] args) { Scanner inp = new Scanner(System.in); String strDate = inp.next() ; int flag = judge(strDate); if(flag!=1) { return ; } String substr=getDate(strDate); String part1 = "yyyyMMdd"; String part2 = "yyyy-MM-dd"; SimpleDateFormat sf = new SimpleDateFormat(part1); SimpleDateFormat sf2 = new SimpleDateFormat(part2); Date d=null; try { d = sf.parse(substr); //獲取時間 }catch(Exception e) { e.printStackTrace(); return; } System.out.println(sf2.format(d)); } }
53010219200508011x 1920-05-08
(二)驗證身份證號碼是否正確(帶校驗算法)
輸入一個字符串,請判斷是否滿足身份證基本要求,並返回具體的生日yyyy-mm-dd。
如果輸入數據有誤,請輸出0000-00-00。基本要求是:
a)必須是18位;
b) 前面位數必須是數字,最后一位可以是數字或小寫字母;
c) 日期是存在的;
d)最后一位校驗碼檢查。
校驗碼規則如下: 1、將前面的身份證號碼17位數分別乘以不同的系數。從第一位到第十七位的系數分別為:7-9-10-5-8-4-2-1-6-3-7-9-10-5-8-4-2。 2、將這17位數字和系數相乘的結果相加。 3、用加出來和除以11,看余數是多少? 4、余數只可能有0-1-2-3-4-5-6-7-8-9-10這11個數字。其分別對應的最后一位身份證的號碼為1-0-X-9-8-7-6-5-4-3-2。 5、通過上面得知如果余數是3,就會在身份證的第18位數字上出現的是9。如果對應的數字是10,身份證的最后一位號碼就是羅馬數字x。
import java.text.*; import java.util.*; public class ClasslibTest { public static int judge(String iden) { if(iden.length() != 18) { return -1; } int i=0; int flag = 1; for(i=0;i<iden.length()-1;i++) { if(!(iden.charAt(i)>='0'&&iden.charAt(i)<='9')) { flag=0; break; } } if(!((iden.charAt(i)>='0'&&iden.charAt(i)<='9')||(iden.charAt(i)>='a'&&iden.charAt(i)<='z'))) { flag=0; } if(flag==0) { return -2; } return flag; } public static String getDate(String iden) { String sub=iden.substring(6, 14); return sub; } public static void printDate(String strDate) { String substr=getDate(strDate); String part1 = "yyyyMMdd"; String part2 = "yyyy-MM-dd"; SimpleDateFormat sf = new SimpleDateFormat(part1); SimpleDateFormat sf2 = new SimpleDateFormat(part2); Date d=null; try { d = sf.parse(substr); //獲取時間 }catch(Exception e) { e.printStackTrace(); return; } System.out.println(sf2.format(d)); } public static int checkIden(String strDate) { int flag = judge(strDate); if(flag!=1) { return -1; } int everPos[]= {7,9,10,5,8,4,2,1,6,3,7,9,10,5,8,4,2}; int LastPos[]= {1,0,-1,9,8,7,6,5,4,3,2}; //-1表示X int n=0; for(int i=0;i<strDate.length()-1;i++) { n+=(strDate.charAt(i)-'0')*everPos[i]; } n %= 11; if((LastPos[n]==-1&&strDate.charAt(17)=='x')||(LastPos[n]==(strDate.charAt(17)-'0'))) return 1; else return -2; } public static void main(String[] args) { Scanner inp = new Scanner(System.in); String strDate = inp.next() ; int flag = checkIden(strDate); if(flag==1) { printDate(strDate); }else { System.out.println("0000-00-00"); } } }
23402613390168801x 0000-00-00 53010219200508011x 1920-05-08
