Java開發技巧總結
阿新 • • 發佈:2021-02-18
一、根據身份證號獲取年齡
工具方法:
/** * 根據身份證號計算年齡——預設與當前系統時間對比 * @param pensonnelIdCard 身份證號 * @return */ public static Integer getPersonAgeFromIdCard1(String pensonnelIdCard) { Integer age = 0; try { //擷取身份證中出行人出生日期中的年、月、日 Integer personYear = Integer.parseInt(pensonnelIdCard.substring(6, 10)); Integer personMonth = Integer.parseInt(pensonnelIdCard.substring(10, 12)); Integer personDay = Integer.parseInt(pensonnelIdCard.substring(12, 14)); Calendar cal = Calendar.getInstance(); // 得到當前時間的年、月、日 Integer yearNow = cal.get(Calendar.YEAR); Integer monthNow = cal.get(Calendar.MONTH) + 1; Integer dayNow = cal.get(Calendar.DATE); // 用當前年月日減去生日年月日 Integer yearMinus = yearNow - personYear; Integer monthMinus = monthNow - personMonth; Integer dayMinus = dayNow - personDay; age = yearMinus; //先大致賦值 if (yearMinus == 0) { //出生年份為當前年份 age = 0; }else{ //出生年份大於當前年份 if (monthMinus < 0) {//出生月份小於當前月份時,還沒滿週歲 age = age - 1; } if (monthMinus == 0) {//當前月份為出生月份時,判斷日期 if (dayMinus < 0) {//出生日期小於當前月份時,沒滿週歲 age = age - 1; } } } }catch (Exception e){ e.printStackTrace(); System.out.println("身份證資訊有誤:" + pensonnelIdCard); }finally { return age; } } /** * 根據身份證號計算年齡——通過與指定時間對比 * @param pensonnelIdCard 身份證號 * @param date 指定的時間 * @return */ public static Integer getPersonAgeFromIdCard2(String pensonnelIdCard, Date date) { Integer age = 0; try { //擷取身份證中出行人出生日期中的年、月、日 Integer personYear = Integer.parseInt(pensonnelIdCard.substring(6, 10)); Integer personMonth = Integer.parseInt(pensonnelIdCard.substring(10, 12)); Integer personDay = Integer.parseInt(pensonnelIdCard.substring(12, 14)); Calendar cal = Calendar.getInstance(); cal.setTime(date); // 得到當前時間的年、月、日 Integer yearNow = cal.get(Calendar.YEAR); Integer monthNow = cal.get(Calendar.MONTH) + 1; Integer dayNow = cal.get(Calendar.DATE); // 用當前年月日減去生日年月日 Integer yearMinus = yearNow - personYear; Integer monthMinus = monthNow - personMonth; Integer dayMinus = dayNow - personDay; age = yearMinus; //先大致賦值 if (yearMinus == 0) { //出生年份為當前年份 age = 0; }else{ //出生年份大於當前年份 if (monthMinus < 0) {//出生月份小於當前月份時,還沒滿週歲 age = age - 1; } if (monthMinus == 0) {//當前月份為出生月份時,判斷日期 if (dayMinus < 0) {//出生日期小於當前月份時,沒滿週歲 age = age - 1; } } } }catch (Exception e){ e.printStackTrace(); System.out.println("身份證資訊有誤:" + pensonnelIdCard); }finally { return age; } }
main方法:
public static void main(String[] args) throws ParseException { //根據身份證號計算年齡——預設與當前系統時間(2021.02.08)對比 Integer age1 = getPersonAgeFromIdCard1("410523199202126017"); System.out.println("根據身份證號計算年齡——預設與當前系統時間對比:" + age1); System.out.println("********************************"); //根據身份證號計算年齡——通過與指定時間對比 Date date= new SimpleDateFormat("yyyy-MM-dd").parse("2000-02-12"); Integer age2 = getPersonAgeFromIdCard2("410523199202126017", date); System.out.println("根據身份證號計算年齡——通過與指定時間對比:" + age2); }
執行結果:
二、BigDecimal使用注意事項
Bigdecimal型別的值進行除法運算時,需要考慮結果是否會出現無限迴圈小數,如果結果是無線迴圈小數,就會報錯,比如:
public static void main(String[] args) { BigDecimal b1 = new BigDecimal("10"); BigDecimal b2 = new BigDecimal("3"); BigDecimal result = b1.divide(new BigDecimal("3")); System.out.println(b1 + "/" + b2 + "=" + result); }
結果:
解決方法:
public static void main(String[] args) {
BigDecimal b1 = new BigDecimal("10");
BigDecimal b2 = new BigDecimal("3");
//方法1:不設定精度
BigDecimal result1 = b1.divide(new BigDecimal("3"), BigDecimal.ROUND_HALF_UP);
System.out.println("方法1--->" + b1 + "/" + b2 + "=" + result1);
//方法2:設定小數點兒保留兩位小數
BigDecimal result2 = b1.divide(new BigDecimal("3"), 2, BigDecimal.ROUND_HALF_UP);
System.out.println("方法2--->" + b1 + "/" + b2 + "=" + result2);
}
執行結果:
補充:
roundingMode為小數模式;
ROUND_CEILING
如果 BigDecimal 是正的,則做 ROUND_UP 操作;如果為負,則做 ROUND_DOWN 操作。
ROUND_DOWN
從不在捨棄(即截斷)的小數之前增加數字。
ROUND_FLOOR
如果 BigDecimal 為正,則作 ROUND_UP ;如果為負,則作 ROUND_DOWN 。
ROUND_HALF_DOWN
若捨棄部分> .5,則作 ROUND_UP;否則,作 ROUND_DOWN 。
ROUND_HALF_EVEN
如果捨棄部分左邊的數字為奇數,則作 ROUND_HALF_UP ;如果它為偶數,則作 ROUND_HALF_DOWN 。
ROUND_HALF_UP
若捨棄部分>=.5,則作 ROUND_UP ;否則,作 ROUND_DOWN 。
ROUND_UNNECESSARY
該“偽舍入模式”實際是指明所要求的操作必須是精確的,,因此不需要舍入操作。
ROUND_UP
總是在非 0 捨棄小數(即截斷)之前增加數字。