數字、字符串、時間、格式化類常用函數解讀——JAVA

目錄

 

一、數字類

1.1超大數浮點數

1.2超大數整數

1.3隨機數: 

1.4格式化輸出 

1.5浮點數和雙精度

二、字符串

2.1String

2.2正則表達式的簡單說明:

2.3可變字符串StringBuffer/StringBuilder

三、時間類

3.1Calendar

四、格式化類

4.1數字格式化DecimalFormat

4.2字符串格式化

4.3時間格式化

4.3.1DateFormat

4.3.2LocalDate


一、數字類

1.1超大數浮點數

BigDecimal b1 = new BigDecimal("123456789.987654321"); // 聲明BigDecimal對象
		BigDecimal b2 = new BigDecimal("987654321.123456789"); // 聲明BigDecimal對象
		System.out.println("b1: " + b1 +  ", b2:" + b2);
		System.out.println("加法操作:" + b2.add(b1)); // 加法操作
		System.out.println("減法操作:" + b2.subtract(b1)); // 減法操作
		System.out.println("乘法操作:" + b2.multiply(b1)); // 乘法操作
		//需要指定位數,防止無限循環,或者包含在try-catch中
		System.out.println("除法操作:" + b2.divide(b1,10,BigDecimal.ROUND_HALF_UP)); // 除法操作包留十位小數進行四捨五入
		
		System.out.println("最大數:" + b2.max(b1)); // 求出最大數
		System.out.println("最小數:" + b2.min(b1)); // 求出最小數
		
		int flag = b1.compareTo(b2);
		if (flag == -1)
			System.out.println("比較操作: b1<b2");
		else if (flag == 0)
			System.out.println("比較操作: b1==b2");
		else
			System.out.println("比較操作: b1>b2");
		
		System.out.println("===================");
		
		//儘量採用字符串賦值
		System.out.println(new BigDecimal("2.3"));

1.2超大數整數

BigInteger b1 = new BigInteger("123456789"); // 聲明BigInteger對象
		BigInteger b2 = new BigInteger("987654321"); // 聲明BigInteger對象
		System.out.println("b1: " + b1 +  ", b2:" + b2);
		System.out.println("加法操作:" + b2.add(b1)); // 加法操作
		System.out.println("減法操作:" + b2.subtract(b1)); // 減法操作
		System.out.println("乘法操作:" + b2.multiply(b1)); // 乘法操作
		System.out.println("除法操作:" + b2.divide(b1)); // 除法操作
		System.out.println("最大數:" + b2.max(b1)); // 求出最大數
		System.out.println("最小數:" + b2.min(b1)); // 求出最小數
		BigInteger result[] = b2.divideAndRemainder(b1); // 求出餘數的除法操作
		System.out.println("商是:" + result[0] + ";餘數是:" + result[1]);
		System.out.println("等價性是:" + b1.equals(b2));
		int flag = b1.compareTo(b2);
		if (flag == -1)
			System.out.println("比較操作: b1<b2");
		else if (flag == 0)
			System.out.println("比較操作: b1==b2");
		else
			System.out.println("比較操作: b1>b2");

1.3隨機數: 

import java.util.Random;

public class RandomTest {

	public static void main(String[] args) 
	{
		//第一種辦法,採用Random類 隨機生成在int範圍內的隨機數
		Random rd = new Random();
		System.out.println(rd.nextInt());
		System.out.println(rd.nextInt(100)); //0--100的隨機數
		System.out.println(rd.nextLong());
		System.out.println(rd.nextDouble());	//返回0.0~1.0直接的數	
		System.out.println("=========================");
		
		//第二種,生成一個範圍內的隨機數 例如0到時10之間的隨機數
		//Math.random[0,1)
		System.out.println(Math.round(Math.random()*10));
		System.out.println("=========================");
		
		
		//JDK 8 新增方法
        rd.ints();  //返回無限個int類型範圍內的數據
        int[] arr = rd.ints(10).toArray();  //生成10個int範圍類的個數。
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        System.out.println("=========================");
		
        arr = rd.ints(5, 10, 100).toArray();//限制範圍10~100
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
        
        System.out.println("=========================");
        
        arr = rd.ints(10).limit(5).toArray();//表示生成10個限定返回5個
        for (int i = 0; i < arr.length; i++) {
            System.out.println(arr[i]);
        }
	}

}

1.4格式化輸出 


public class MathTest {

	public static void main(String[] args) {
		
		System.out.println(Math.abs(-5));    //絕對值
		System.out.println(Math.max(-5,-8)); //最大值
		System.out.println(Math.pow(-5,2));  //求冪
		System.out.println(Math.round(3.5)); //四捨五入
		System.out.println(Math.ceil(3.5));  //向上取整
		System.out.println(Math.floor(3.5)); //向下取整
	}

}

輸出:
5
-5
25.0
4
4.0
3.0

1.5浮點數和雙精度

float f1 = 1.23f;
		// float f2 = 1.23;  error, float賦值必須帶f
		double d1 = 4.56d;
		double d2 = 4.56;  //double 可以省略末尾d

二、字符串

2.1String


public class StringTest {

	public static void main(String[] args) {
		String a = "123;456;789;123 ";
		System.out.println(a.charAt(0)); // 返回第0個元素
		System.out.println(a.indexOf(";")); // 返回第一個;的位置
		System.out.println(a.concat(";000")); // 連接一個新字符串並返回,a不變
		System.out.println(a.contains("000")); // 判斷a是否包含000
		System.out.println(a.endsWith("000")); // 判斷a是否以000結尾
		System.out.println(a.equals("000")); // 判斷是否等於000
		System.out.println(a.equalsIgnoreCase("000"));// 判斷在忽略大小寫情況下是否等於000
		System.out.println(a.length()); // 返回a長度
		System.out.println(a.trim()); // 返回a去除前後空格後的字符串,a不變
		String[] b = a.split(";"); // 將a字符串按照;分割成數組
		for (int i = 0; i < b.length; i++) {
			System.out.println(b[i]);
		}

		System.out.println("===================");

		System.out.println(a.substring(2, 5)); // 截取a的下標爲2(第三個)到下標爲5(第6個)字符 a不變
		System.out.println(a.replace("1", "a"));
		System.out.println(a.replaceAll("1", "a")); // replaceAll第一個參數是正則表達式

		System.out.println("===================");

		String s1 = "12345?6789";
		String s2 = s1.replace("?", "a");
		String s3 = s1.replaceAll("[?,8]", "a");
		// 這裏的[?] 才表示字符問號,這樣才能正常替換。不然在正則中會有特殊的意義就會報異常
		System.out.println(s2);
		System.out.println(s3);
		System.out.println(s1.replaceAll("[\\d]", "a")); //將s1內所有數字替換爲a並輸出,s1的值未改變。

	}
}

輸出:
1
3
123;456;789;123 ;000
false
false
false
false
16
123;456;789;123
123
456
789
123 
===================
3;4
a23;456;789;a23 
a23;456;789;a23 
===================
12345a6789
12345a67a9
aaaaa?aaaa

2.2正則表達式的簡單說明:

?,*,+,\d,\w 都是等價字符
  ?等價於匹配長度{0,1}
  *等價於匹配長度{0,}
  +等價於匹配長度{1,}
  \d等價於[0-9]

\D等價於[^0-9]
\w等價於[A-Za-z_0-9]

\W等價於[^A-Za-z_0-9]。

例1:

System.out.println("15088688388".replaceAll("(\\d{3})(\\d{4})","$1****"));

\\d{3}爲150, \\d{4}爲8868 ,$1爲第一組,就是\\d{3}。所以輸出150****8388

System.out.println("15088688388".replaceAll("(\\d{3})(\\d{4})","$1222"));輸出1502228388

例2:

System.out.println("15088688388".replaceAll("\\d","b"));輸出bbbbbbbbbbb

\d表示是數字,但是因爲含本身前面有\所以前面還需要一個\

System.out.println("15088688388".replaceAll("\\d+","b"));輸出b,

+號表示一次或者多次.所以整體被替換。

這篇博客值得一看

https://blog.csdn.net/make164492212/article/details/51656638

2.3可變字符串StringBuffer/StringBuilder

上一篇博客有舉例驗證兩者性能。

capacity>=length空間大小。

舉例證明StringBuffer字符串可變。


public class StringBufferReferenceTest {

	public static void main(String[] args) {
		StringBuffer sb1 = new StringBuffer("123");
		StringBuffer sb2 = sb1;
		
		sb1.append("2222");
        System.out.println(sb1); 
		System.out.println(sb2);  //sb1 和 sb2還是指向同一個內存的

	}

}
輸出:
1232222
1232222

常見函數舉例


public class StringBuffertest {

	public static void main(String[] args) {
		// TODO 自動生成的方法存根
		StringBuffer sb1 = new StringBuffer("123");
		sb1.append("12");//12312
		System.out.println(sb1);
		sb1.insert(2,"haha");//在第二個字符後面插入12haha12
		System.out.println(sb1);
		sb1.delete(2,3);//刪除第2~3個字符,含尾不含頭
		System.out.println(sb1);
		sb1.replace(2,5,"222");//替換第2~5個字符(第3,4,5),含尾不含頭
		System.out.println(sb1);
		String s1=sb1.substring(3,6);//截取3~6個字符(第4,5,6),原字符串不變
		System.out.println(s1);
		System.out.println(sb1);

	}

}
輸出:
12312
12haha312
12aha312
12222312
223
12222312

三、時間類

3.1Calendar

舉例:

獲取時間,年月日星期幾時分秒,計算每一個月的最後一天,設定年月日,並在修改年月日

import java.util.Calendar;

public class CalendarTest {
	
	Calendar calendar = Calendar.getInstance();
	
	public void test1() {
        // 獲取年
        int year = calendar.get(Calendar.YEAR);
        // 獲取月,這裏需要需要月份的範圍爲0~11,因此獲取月份的時候需要+1纔是當前月份值
        int month = calendar.get(Calendar.MONTH) + 1;
        // 獲取日
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        // 獲取時
        int hour = calendar.get(Calendar.HOUR);
        // int hour = calendar.get(Calendar.HOUR_OF_DAY); // 24小時表示
        // 獲取分
        int minute = calendar.get(Calendar.MINUTE);
        // 獲取秒
        int second = calendar.get(Calendar.SECOND);

        // 星期,英語國家星期從星期日開始計算
        int weekday = calendar.get(Calendar.DAY_OF_WEEK);

        System.out.println("現在是" + year + "年" + month + "月" + day + "日" + hour
                + "時" + minute + "分" + second + "秒" + "星期" + weekday);
    }

    // 一年後的今天
    public void test2() {
        // 同理換成下個月的今天calendar.add(Calendar.MONTH, 1);
        calendar.add(Calendar.YEAR, 1);

        // 獲取年
        int year = calendar.get(Calendar.YEAR);
        // 獲取月
        int month = calendar.get(Calendar.MONTH) + 1;
        // 獲取日
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        System.out.println("一年後的今天:" + year + "年" + month + "月" + day + "日");
    }

    // 獲取任意一個月的最後一天
    public void test3() {
        // 假設求6月的最後一天
        int currentMonth = 6;
        // 先求出7月份的第一天,實際中這裏6爲外部傳遞進來的currentMonth變量
        // 1
        calendar.set(calendar.get(Calendar.YEAR), currentMonth, 1);

        calendar.add(Calendar.DATE, -1);

        // 獲取日
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        System.out.println("6月份的最後一天爲" + day + "號");
    }

    // 設置日期
    public void test4() {
        calendar.set(Calendar.YEAR, 2000);
        System.out.println("現在是" + calendar.get(Calendar.YEAR) + "年");

        calendar.set(2018, 7, 8);
        // 獲取年
        int year = calendar.get(Calendar.YEAR);
        // 獲取月
        int month = calendar.get(Calendar.MONTH)+1;
        // 獲取日
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        System.out.println("現在是" + year + "年" + month + "月" + day + "日");
    }
    
    //add和roll的區別,roll如果改變號,不會引起月的改變(不會改變上一級)。
    public void test5() {     

        calendar.set(2018, 7, 8);
        calendar.add(Calendar.DAY_OF_MONTH, -8);
        
        // 獲取年
        int year = calendar.get(Calendar.YEAR);
        // 獲取月
        int month = calendar.get(Calendar.MONTH)+1;
        // 獲取日
        int day = calendar.get(Calendar.DAY_OF_MONTH);

        System.out.println("2018.8.8, 用add減少8天,現在是" + year + "." + month + "." + day);
        
        calendar.set(2018, 7, 8);
        calendar.roll(Calendar.DAY_OF_MONTH, -8);
        
        // 獲取年
        year = calendar.get(Calendar.YEAR);
        // 獲取月
        month = calendar.get(Calendar.MONTH)+1;
        // 獲取日
        day = calendar.get(Calendar.DAY_OF_MONTH);

        System.out.println("2018.8.8, 用roll減少8天,現在是" + year + "." + month + "." + day);
    }
    
    
	public static void main(String[] args) {
		CalendarTest c = new CalendarTest();
		c.test1();
		System.out.println("============");
		c.test2();
		System.out.println("============");
		c.test3();
		System.out.println("============");
		c.test4();
		System.out.println("============");
		c.test5();

	}

}
輸出:
現在是2020年1月12日8時13分51秒星期1
============
一年後的今天:2021年1月12日
============
6月份的最後一天爲30號
============
現在是2000年
現在是2018年8月8日
============
2018.8.8, 用add減少8天,現在是2018.7.31
2018.8.8, 用roll減少8天,現在是2018.8.31

另外還有Date,DateUtil,Duration,LocalDate,LocalTime等類控制時間。可以詳細瞭解。

四、格式化類

4.1數字格式化DecimalFormat

#表示:最多; 0表示:只能

整數部分爲0 , #認爲整數不存在,可不寫; 0認爲沒有,但至少寫一位,寫0

整數部分不爲0,0和#對整數部分多位時的處理是一致的 就是有幾位寫多少位

小數部分#代表最多有幾位,0代表必須有且只能有幾位

舉例:

科學計數法、控制整數、小數位數、百分比表示

import java.text.DecimalFormat;

public class DecimalFormaterRuleTest {
	public static void main(String[]args){
        
        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代表必須有且只能有幾位
        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
        double pi=3.1415927;//圓周率
        //取一位整數 
        System.out.println(new DecimalFormat("0").format(pi));//3
        //取一位整數和兩位小數  
        System.out.println(new DecimalFormat("0.00").format(pi));//3.14
        //取兩位整數和三位小數,整數不足部分以0填補。  
        System.out.println(new DecimalFormat("00.000").format(pi));//03.142  
        //取所有整數部分  
        System.out.println(new DecimalFormat("#").format(pi));//3  
        //以百分比方式計數,並取兩位小數  
        System.out.println(new DecimalFormat("#.##%").format(pi));//314.16%  
        
        long c=299792458;//光速  
        //顯示爲科學計數法,並取五位小數  
        System.out.println(new DecimalFormat("#.#####E0").format(c));//2.99792E8  
        //顯示爲兩位整數的科學計數法,並取四位小數  
        System.out.println(new DecimalFormat("00.####E0").format(c));//29.9792E7  
        //每三位以逗號進行分隔。  
        System.out.println(new DecimalFormat(",###").format(c));//299,792,458  
        //將格式嵌入文本  
        System.out.println(new DecimalFormat("光速大小爲每秒,###米").format(c)); //光速大小爲每秒299,792,458米
         
    }
}
輸出:
整數部分爲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
3
3.14
03.142
3
314.16%
2.99792E8
29.9792E7
299,792,458
光速大小爲每秒299,792,458米

四捨五入。向上向下取值請看前文一、數字類



import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.text.NumberFormat;
public class TwoDigitsTest {

	public static void main(String[] args) {
		double   f   =   111231.5585;  
		BigDecimal   b   =   new   BigDecimal(f);  
		double   f1   =   b.setScale(2,BigDecimal.ROUND_HALF_UP).doubleValue();  
		System.out.println(f1); //111231.56
		
		DecimalFormat   df   =new DecimalFormat("#.00");  
		String f2 = df.format(f);
		System.out.println(f2); //111231.56
		 
		String f3 = String.format("%.2f",f);
		System.out.println(f3); //111231.56
		
		NumberFormat ddf1=NumberFormat.getInstance() ;
		System.out.println(ddf1.getClass().getName());
		ddf1.setMaximumFractionDigits(2); 
		String f4= ddf1.format(f) ; 
		System.out.println(f4);  //111,231.56		
	}
}
輸出:
111231.56
111231.56
111231.56
java.text.DecimalFormat
111,231.56

 

4.2字符串格式化

MessageFormat:字符串格式化,利用參數和數組進行格式化

import java.text.MessageFormat;

public class MessageFormatTest {

	public static void main(String[] args) {
		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

4.3時間格式化

4.3.1DateFormat

import java.text.DateFormat;
import java.util.Locale;
import java.text.SimpleDateFormat;
import java.util.Date;

public class SimpleDateTest {

	public static void main(String[] args) {

		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)) ;    // 將日期變爲新的格式  

        Date date = new Date();
		DateFormat df1 = DateFormat.getInstance();
		DateFormat df2 = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss EE");
		DateFormat df3 = new SimpleDateFormat("yyyy年MM月dd日 hh時mm分ss秒  EE",Locale.CHINA);
		DateFormat df4 = new SimpleDateFormat("dd-MMMM-yyyy hh:mm:ss EE",Locale.US);
		DateFormat df5 = new SimpleDateFormat("yyyy-MM-dd");
		DateFormat df6 = new SimpleDateFormat("yyyy年MM月dd日");
		
		System.out.println("-------將日期按不同格式進行輸出-------");
		System.out.println("按照java默認的日期格式:"+df1.format(date));
		System.out.println("按照指定格式 yyyy-MM-dd hh:mm:ss EE,系統默認區域:"+df2.format(date));
		System.out.println("按照指定格式 yyyy年MM月dd日  hh時mm分ss秒  EE,區域爲中國:"+df3.format(date));
		System.out.println("按照指定格式dd-MMMM-yyyy hh:mm:ss EE,區域爲美國:"+df4.format(date));
		System.out.println("按照指定格式 yyyy-MM-dd :"+df5.format(date));
		System.out.println("按照指定格式 yyyy年MM月dd日 :"+df6.format(date));
	}

}
輸出:
2008年10月19日 10時11分30秒345毫秒
-------將日期按不同格式進行輸出-------
按照java默認的日期格式:20-1-12 下午8:55
按照指定格式 yyyy-MM-dd hh:mm:ss EE,系統默認區域:2020-01-12 08:55:22 星期日
按照指定格式 yyyy年MM月dd日  hh時mm分ss秒  EE,區域爲中國:2020年01月12日 08時55分22秒  星期日
按照指定格式dd-MMMM-yyyy hh:mm:ss EE,區域爲美國:12-January-2020 08:55:22 Sun
按照指定格式 yyyy-MM-dd :2020-01-12
按照指定格式 yyyy年MM月dd日 :2020年01月12日

4.3.2LocalDate

import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;

public class DateFormatterTest {

	public static void main(String[] args) {
		//將字符串轉化爲時間
		String dateStr= "2016年10月25日";
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日");
        LocalDate date= LocalDate.parse(dateStr, formatter);
        System.out.println(date.getYear() + "-" + date.getMonthValue() + "-" + date.getDayOfMonth());
        
        System.out.println("==========================");
        
        //將日期轉換爲字符串輸出
        LocalDateTime now = LocalDateTime.now();
        DateTimeFormatter format = DateTimeFormatter.ofPattern("yyyy年MM月dd日 hh:mm:ss");
        String nowStr = now.format(format);
        System.out.println(nowStr);


	}

}
輸出:
2016-10-25
==========================
2020年01月12日 08:45:27

參考:中國大學mooc java核心技術 陳良育

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章