Java String

Trong phần này, chúng ta sẽ làm việc với dữ liệu string một cách chi tiết hơn.

String là các kiểu dữ liệu rất quan trọng trong ngôn ngữ máy tính. Đó là lý do tại sao chúng ta dành toàn bộ một chương để làm việc với string trong Java.

Định nghĩa string trong Java

Trong Java, string là một dãy ký tự Unicode. String là các object. Có 2 class cơ bản để làm việc với string.
– String
– StringBuilder
String là một dãy ký tự bất biến. StringBuilder là một chuỗi ký tự có thể thay đổi. (Ngoài ra còn có một class StringBuffer có thể được sử dụng bởi multi-thread. Nếu chương trình không sử dụng multi-thread, chúng ta sử dụng class StringBuilder)

Hằng string một chuỗi các ký tự được kèm theo trong ngoặc kép. Ví dụ: “Java” là một hằng string. Bất cứ khi nào trình biên dịch Java gặp một chuỗi ký tự trong code, nó sẽ tạo ra một đối tượng String với giá trị của nó.

String lang = "Java"; // same as String lang = new String("Java");

Hằng string được sử dụng bởi nhiều ngôn ngữ lập trình. Đó là một quy ước giúp tiết kiệm thời gian typing.

Khởi tạo string trong Java

Có nhiều cách tạo string, cả không thể thay đổi và có thể thay đổi. Mình sẽ chỉ một vài cách tạo string hay sử dụng.

StringInit.java

package net.vncoding;

public class StringInit {

    public static void main(String[] args) {
        
        char[] cdb = {'M', 'y', 'S', 'Q', 'L'};

        String lang = "Java";
        String ide = new String("NetBeans");
        String db = new String(cdb);

        System.out.println(lang);
        System.out.println(ide);
        System.out.println(db);
        
        StringBuilder sb1 = new StringBuilder(lang);
        StringBuilder sb2 = new StringBuilder();
        sb2.append("Fields");
        sb2.append(" of ");
        sb2.append("glory");
        
        System.out.println(sb1);
        System.out.println(sb2);
    }
}

Ví dụ trên chỉ ra 1 vài cách tạo đối tượng String và StringBuilder.

String lang = "Java";

Đây là cách phổ biến nhất để tạo object string từ hằng chuỗi kí tự

String ide = new String("NetBeans");

Đây là cách tạo đối tượng String thông qua toán tử new và khởi tạo bằng hằng chuỗi kí tự

String db = new String(cdb);

Đây là cách tạo đối tượng String với toán tử new và khởi tạo bằng 1 mảng các kí tự.

StringBuilder sb1 = new StringBuilder(lang);

Đây là cách tạo 1 đối tượng StringBuilder từ toán tử new và đối tượng String.

StringBuilder sb2 = new StringBuilder();
sb2.append("Fields");
sb2.append(" of ");
sb2.append("glory");

Tạo đối tượng rỗng StringBuilder. Và append 3 chuỗi hằng kí tự vào đối tượng.

Kết quả:
Java
NetBeans
MySQL
Java
Fields of glory

String trong Java là object

Các strin trong Java là các object, chúng không phải là kiểu dữ liệu nguyên thủy. String là thể hiện (instance) của class String hoặc StringBuilder. Vì chúng là các object, nên chúng có rất nhiều phương thức đi kèm.

StringObjects.java

package net.vncoding;

public class StringObjects {

    public static void main(String[] args) {
    
        String lang = "Java";
        
        String bclass = lang.getClass().toString();        
        System.out.println(bclass);
        
        String sup = lang.getClass().getSuperclass().toString();
        System.out.println(sup);                
                
        if (lang.isEmpty()) {
            
            System.out.println("The string is empty");
        } else {
            
            System.out.println("The string is not empty");
        }
        
        int l = lang.length();        
        System.out.println("The string has " + l + " characters");
        
    }
}

Trong đoạn code này, mình minh họa string là object. Object phải có tên class, class cha và có một số phương thức.

String lang = "Java";

Object của string được tạo

String bclass = lang.getClass().toString();  

Xác định tên class của object mà đối tượng lang refer tới.

String sup = lang.getClass().getSuperclass().toString();

Parent class của đối tượng được nhận. Tất cả các object có ít nhất 1 parent object.

if (lang.isEmpty()) {
    
    System.out.println("The string is empty");
} else {
    
    System.out.println("The string is not empty");
}

Object có rất nhiều phương thức. isEmpty() là phương thức xác định string là rỗng hay không.

int l = lang.length();    

Phương thúc length() trả về kích thước của string.

Kết quả:
class java.lang.String
class java.lang.Object
The string is not empty
The string has 4 characters

String tĩnh và động trong Java

String là một dãy các ký tự bất biến, trong khi StringBuilder là một dãy các ký tự có thể thay đổi. Ví dụ tiếp theo sẽ cho thấy sự khác biệt.

MutableImmutable.java

package net.vncoding;

public class MutableImmutable {

    public static void main(String[] args) {
        
        String name = "Jane";
        String name2 = name.replace('J', 'K');
        String name3 = name2.replace('n', 't');
        
        System.out.println(name);
        System.out.println(name3);
        
        StringBuilder sb = new StringBuilder("Jane");
        System.out.println(sb);
        
        sb.setCharAt(0, 'K');
        sb.setCharAt(2, 't');
        
        System.out.println(sb);
    }
}   

Object có phương thức replace các kí tự trong string

String name = "Jane";
String name2 = name.replace('J', 'K');
String name3 = name2.replace('n', 't');   

Gọi phương thức replace() bởi 1 đối tượng String sẽ trả về một String mới sửa đổi. String ban đầu không thay đổi.

sb.setCharAt(0, 'K');
sb.setCharAt(2, 't');

Phương thức setCharAt() của StringBuilder sẽ thay thế một ký tự tại vị trí đã cho bằng một ký tự mới. String gốc được sửa đổi.

Kết quả:
Jane
Kate
Jane
Kate

Nối 2 string trong Java

– String không thay đổi có thể được ghép với nhau bởi toán tử ‘+’ hoặc phương thức concat(). Chúng sẽ tạo thành một chuỗi mới từ các string con.
– String biến đổi có phương thức append() để tạo một chuỗi từ bất kỳ số chuỗi nào khác.

package net.vncoding;

public class ConcatenateStrings {

    public static void main(String[] args) {
    
        System.out.println("Return" + " of " + "the king.");
        System.out.println("Return".concat(" of ").concat("the king."));
        
        StringBuilder sb = new StringBuilder();
        sb.append("Return");
        sb.append(" of ");
        sb.append("the king.");
        
        System.out.println(sb);
    }
}

Ví dụ này tạo string mới từ 3 string

System.out.println("Return" + " of " + "the king.");

String mới được tạo bởi toán tử +

System.out.println("Return".concat(" of ").concat("the king."));

Phương thức concat() trả về một string thể hiện sự ghép nối các kí tự của đối tượng string với các kí tự của đối số.

StringBuilder sb = new StringBuilder();
sb.append("Return");
sb.append(" of ");
sb.append("the king.");

Một đối tượng string có thể thay đổi của kiểu StringBuilder được tạo ra bằng cách gọi phương thức append() ba lần.

Kết quả:
Return of the king.
Return of the king.
Return of the king.

Sử dụng dấu “” trong string

Trong một số trường hợp, như muốn trích dẫn câu nói của ai đó, chúng ta cần sử dụng dấu “”.

Quotes.java

package net.vncoding;

public class Quotes {

    public static void main(String[] args) {
        
        System.out.println("There are may stars");
        System.out.println("He said: \"Which one are you looking at?\"");
    }
}

Chúng ta sử dụng kí tự ‘\’ để sử dụng dấu “.

Kết quả:
There are may stars
He said: “Which one are you looking at?”

String multi-line

Không thể tạo chuỗi multiline trong Java. Để mở rộng một chuỗi trên nhiều dòng, chúng ta cần phải thực hiện một phép toán nối.

MultilineString.java

package net.vncoding;

public class MultilineString {

    static String lyrics = "I'm Viet\n" +
"I'm a programmer\n" +
"I like writing a programming tutorial\n";
    
    
    public static void main(String[] args) {
        
        System.out.println(lyrics);
    }
}

Kết quả:
I’m Viet
I’m a programmer
I like writing a programming tutorial

Kí tự trong string

Một string là một dãy ký tự. Một kí tự là một phần tử cơ bản của một chuỗi. Hai ví dụ sau đây cho thấy một số phương pháp làm việc với các ký tự của một chuỗi.

StringElements.java

package net.vncoding;


public class StringElements {

    public static void main(String[] args) {
    
        char[] crs = {'Z', 'e', 't', 'C', 'o', 'd', 'e' };
        String s = new String(crs);
        
        char c1 = s.charAt(0);
        char c2 = s.charAt(s.length()-1);
        
        System.out.println(c1);
        System.out.println(c2);
        
        int i1 = s.indexOf('e');
        int i2 = s.lastIndexOf('e');
        
        System.out.println("The first index of character e is " + i1);
        System.out.println("The last index of character e is " + i2);
        
        System.out.println(s.contains("t"));
        System.out.println(s.contains("f"));
        
        char[] elements = s.toCharArray();
        
        for (char el : elements) {
            
            System.out.println(el);
        }                
    }
}

Trong ví dụ đầu tiên, chúng ta sẽ làm việc với string không thay đổi.

char[] crs = {'Z', 'e', 't', 'C', 'o', 'd', 'e' };
String s = new String(crs);

Một string không thay đổi mới được tạo thành từ một loạt các ký tự.

char c1 = s.charAt(0);
char c2 = s.charAt(s.length()-1);

Với phương thức charAt(), chúng ta nhận được giá trị char đầu tiên và cuối cùng của chuỗi.

int i1 = s.indexOf('e');
int i2 = s.lastIndexOf('e');

Với phương thức indexOf() và lastIndexOf(), chúng ta sẽ lấy được vị trí xuất hiện đầu tiên và cuối cùng của ký tự ‘e’.

System.out.println(s.contains("t"));

Với phương thức contains(), chúng ta kiểm tra nếu string chứa ký tự t. Phương thức trả về một giá trị boolean.

char[] elements = s.toCharArray();

for (char el : elements) {
    
    System.out.println(el);
} 

Phương thức toCharArray () tạo ra một mảng ký tự từ chuỗi. Chúng ta duyệt mảng bằng vòng lặp for và in ra từng kí tự.

Kết quả:
Z
e
The first index of character e is 1
The last index of character e is 6
true
false
Z
e
t
C
o
d
e

Trong ví dụ 2, chúng ta sẽ làm việc với các phần tử của lớp StringBuilder.

StringBuilderElements.java

package net.vncoding;

public class StringBuilderElements {

    public static void main(String[] args) {
        
        StringBuilder sb = new StringBuilder("Misty mountains");
        System.out.println(sb);
        
        sb.deleteCharAt(sb.length()-1);
        System.out.println(sb);
        
        sb.append('s');
        System.out.println(sb);
        
        sb.insert(0, 'T');
        sb.insert(1, 'h');
        sb.insert(2, 'e');
        sb.insert(3, ' ');
        System.out.println(sb);
        
        sb.setCharAt(4, 'm');
        System.out.println(sb);    
    }
}

Một string có thể thay đổi được tạo thành. Chúng ta sửa đổi nội dung của chuỗi bằng cách xóa, nối, chèn và thay thế ký tự.

sb.deleteCharAt(sb.length()-1);

Dòng này xóa kí tự cuối cùng của string

sb.append('s');

Ký tự đã xóa được nối lại với string.

sb.insert(0, 'T');
sb.insert(1, 'h');
sb.insert(2, 'e');
sb.insert(3, ' ');

Chúng ta chèn bốn ký tự ở đầu chuỗi.

sb.setCharAt(4, 'm');

Cuối cùng, chúng ta thay thế một ký tự ở chỉ số 4.

Kết quả:
Misty mountains
Misty mountain
Misty mountains
The Misty mountains
The misty mountains

Substring trong Java

Phương thức substring () trả về một phần của một chuỗi. Chỉ mục bắt đầu là inclusive, chỉ số kết thúc là exclusive. Chỉ số bắt đầu bắt đầu từ 0.

Substrings.java

package net.vncoding;

public class Substrings {

    public static void main(String[] args) {
        
        String str = "bookcase";
        
        System.out.println(str.substring(0, 4));
        System.out.println(str.substring(4, str.length()));
    }
}

Ví dụ sử dụng phương thức substring() để tạo 2 chuỗi con.

System.out.println(str.substring(0, 4));

Chúng ta lấy được chuỗi con “book”, ý nghĩa của 0 và 4 là lấy 4 kí tự từ kí tự đầu tiên của chuỗi.

System.out.println(str.substring(4, str.length()));

Chuỗi con “case” được in.

Kết quả:
book
case

Phân tách chuỗi trong Java

Phương thức split() tách chuỗi thành nhiều phần.

Splitting.java

package net.vncoding;

public class Splitting {

    public static void main(String[] args) {
        
        String s = "Today is a beautiful day.";
        
        String[] words = s.split(" ");
        
        for (String word : words) {
            
            System.out.println(word);
        }
    }
}

Ví dụ chia chuỗi thành các word.

String s = "Today is a beautiful day.";

Đây là chuỗi được chia. Mỗi word phân cách nhau bởi dấu space.

String[] words = s.split(" ");

Sử dụng phương thức split(), cắt chuỗi thành các word. Dấu space được sử dụng làm dấu phân cách. Phương thức trả về 1 mảng các chuỗi.

for (String word : words) {
    
    System.out.println(word);
}

Duyệt mảng và in ra các chuỗi con.

Kết quả:
Today
is
a
beautiful
day.

Remove các kí tự trong chuỗi Java

Khi chia chuỗi thành các word, một vài word có kí tự bắt đầu và kết thúc như dấu phẩy hoặc dấu chấm. Trong ví dụ này, chỉ ra cách xóa các kí tự này.

RemovingChars.java

package net.vncoding;

public class RemovingChars {

    public static void main(String[] args) {

        String str = "Did you go there? We did, but we had a \"great\" service there.";

        String[] parts = str.split(" ");
        
        for (String part: parts) {
            
            String word = removeChars(part);
            System.out.println(word);
        }
    }

    private static String removeChars(String part) {

        String word = part;

        if (part.endsWith(".") || part.endsWith("?") || part.endsWith(",")) {
            word = part.substring(0, part.length()-1);
        }

        if (part.startsWith("\"") &&  part.endsWith("\"")) {
            word = part.substring(1, part.length()-1);
        }

        return word;
    }
}

Ví dụ chia một chuỗi thành từ và loại bỏ dấu phẩy, dấu chấm, dấu hỏi hoặc dấu nháy kép.

String str = "Did you go there? We did, but we had a \"great\" service there.";

Trong chuỗi này, chúng ta có dấu chấm hỏi, dấu phẩy, dấu ngoặc kép, và dấu chấm gắn liền với từ.

private static String removeChars(String part) {

Bên trong phương thức removeChars(), chúng tôi xóa các ký tự này khỏi word

if (part.endsWith(".") || part.endsWith("?") || part.endsWith(",")) {
    word = part.substring(0, part.length()-1);
}

Trong câu lệnh if này, chúng ta remove kí tự kết thúc. Sử dụng phương thức endWith() để xác định các ký tự muốn loại bỏ. Phương thức substring() trả về một phần của chuỗi mà không có ký tự.

if (part.startsWith("\"") &&  part.endsWith("\"")) {
    word = part.substring(1, part.length()-1);
}

Tương tự như vậy, loại bỏ các ký tự bắt đầu. Ký tự bắt đầu được kiểm tra bằng phương thức startsWith().

Kết quả:
Did
you
go
there
We
did
but
we
had
a
great
service
there

Join chuỗi trong Java

Kể từ Java 8, chúng ta có một phương thức join() để kết nối các chuỗi.

Joining.java

package net.vncoding;

public class Joining {

    public static void main(String[] args) {

        String joined = String.join(" ", "Today", "is", "Sunday"); 
        
        System.out.println(joined);
    }
}

Trong ví dụ, chúng ta join 3 chuỗi thành một chuỗi cuối cùng.

String joined = String.join(" ", "Today", "is", "Sunday"); 

Tham số đầu tiên của phương thức join() là một dấu phân tách sẽ tách riêng từng chuỗi trong chuỗi con trong chuỗi cha . Các tham số còn lại là các chuỗi được nối.

Kết quả:
Today is Sunday

So sanh 2 chuỗi trong Java

Có hai phương thức cơ bản để so sánh chuỗi. Phương thức equals() so sánh nội dung của hai chuỗi và trả về một giá trị boolean cho biết 2 chuỗi có bằng hay không. EqualsIgnoreCase() thực hiện giống phương thức equal(), ngoại trừ việc nó bỏ qua viết hoa viết thường.

ComparingStrings.java

package net.vncoding;

public class ComparingStrings {

    public static void main(String[] args) {

        String a = "book";
        String b = "Book";
        
        System.out.println(a.equals(b));
        System.out.println(a.equalsIgnoreCase(b));                        
    }
}

Ví dụ minh họa sử dụng 2 phương thức so sánh 2 chuỗi.

String a = "book";
String b = "Book";

Khai báo 2 chuỗi String cho việc so sánh.

System.out.println(a.equals(b));

Phương thức equals() trả về false do 2 chuỗi khác nhau kí tự đầu tiên.

System.out.println(a.equalsIgnoreCase(b));   

Khi chúng ta bỏ qua việc phân biệt kí tự in hoa và in thường, các chuỗi đều như nhau, phương thức equalsIgnoreCase() trả về true.

Kết quả:
false
true

Nếu chúng ta so sánh một biến với một chuỗi, điều quan trọng là phải nhớ rằng chuỗi phải nằm ở phía bên trái của phương thức so sánh. Nếu không chúng ta có thể nhận được NullPointerException.

ComparingStrings2.java

package net.vncoding;
import java.util.Random;

public class ComparingStrings2 {
    
    public static String readString() {
        
        Random r = new Random();
        boolean b = r.nextBoolean();
        
        if (b == true) {
            
            return "ZetCode";
        } else {
            
            return null;
        }                
    }

    public static void main(String[] args) {

        String d = readString();
                
        if ("ZetCode".equals(d)) {
            
            System.out.println("Strings are equal");
        } else {
            
            System.out.println("Strings are not equal");
        }                            
    }
}

Trong ví dụ này, chúng ta so sánh các chuỗi đúng cách, tránh NullPointerException có thể xảy ra.

public static String readString() {
    
    Random r = new Random();
    boolean b = r.nextBoolean();
    
    if (b == true) {
        
        return "ZetCode";
    } else {
        
        return null;
    }                
}      

Phương thức readString() mô phỏng trường hợp một lời gọi phương thức có thể dẫn đến một giá trị null. Điều này có thể xảy ra, ví dụ, nếu chúng ta cố gắng đọc một giá trị từ cơ sở dữ liệu.

String d = readString();

Biến d bao gồm giá trị null

if ("ZetCode".equals(d)) {  

Dòng code này là cách chính xác để so sánh hai chuỗi mà một chuỗi là một ký tự được biết đến. Nếu chúng ta đặt biến d ở phía bên trái, điều này sẽ dẫn đến NullPointerException nếu biến d sẽ chứa giá trị null.

Phương thức equals() so sánh các ký tự của hai chuỗi. Sử dụng toán tử ‘==’ để test độc lập với equals(). Tất cả các hằng chuỗi kí tự được intern tự động trong Java. Họ được đặt bên trong string pool. Điều này được thực hiện trong thời gian biên dịch. Nếu hai biến chứa 2 hằng chuỗi kí tự giống nhau, chúng refer tới cùng một đối tượng chuỗi trong string pool.

ComparingStrings3.java

package net.vncoding;
import java.util.Random;

public class ComparingStrings3 {

    public static void main(String[] args) {

        boolean a = "VnCoding" == "VnCoding";
        boolean b = "VnCoding" == new String("VnCoding");
        boolean c = "VnCoding" == "Vn" + "Coding";
        boolean d = "VnCoding" == new String("VnCoding").intern();
        boolean e = "VnCoding" == " VnCoding ".trim();
        
        System.out.println(a);
        System.out.println(b);
        System.out.println(c);
        System.out.println(d);
        System.out.println(e);            
    }
}

Trong ví dụ này, chúng ta so sánh các đối tượng chuỗi bằng toán tử ==.

boolean a = "VnCoding" == "VnCoding";

Hằng chuỗi kí tự được intern. Do đó biểu thức so sánh trả về true

boolean b = "VnCoding" == new String("VnCoding");

Chuỗi được tạo bằng toán tử new, không được intern. Toán tử so sánh trả về false.

boolean c = "VnCoding" == "Vn" + "Coding";

Các chuỗi được nối vào lúc biên dịch. Các hằng chuỗi kí tự trong cùng một đối tượng. Kết quả trả về là true.

boolean d = "VnCoding" == new String("VnCoding").intern();

Đối tượng intern() đặt đối tượng chuỗi ở phía bên phải trong pool. Vì vậy, biến d = true.

boolean e = "VnCoding" == " VnCoding ".trim();

Phương thức trim() được gọi trong thời gian chạy (runtime), tạo ra một đối tượng khác biệt. Biến e = false.

Kết quả:
true
false
true
true
false

Định dạng string trong Java

Chúng ta có thể sử dụng cả hai phương thức System.out.printf() và System.out.format() để định dạng chuỗi trong Java. 2 phương thức làm việc như nhau. Hai phương pháp này viết một chuỗi định dạng cho dòng đầu ra bằng cách sử dụng chuỗi định dạng và đối số được chỉ định. Nếu đối số nhiều hơn định dạng, các đối số thừa sẽ bị bỏ qua.

%[argument_index$][flags][width][.precision]conversion

Định dạng chung cho các kiểu số và kí tự.

%[argument_index$][flags][width]conversion

Đây là cú pháp để mô tả date và time.

Dưới đây là ví dụ mô tả định dạng cho chuỗi kí tự

Conversions.java

package net.vncoding;

public class Conversions {

    public static void main(String[] args) {
        
        System.out.format("There are %d %s.%n", 5, "pencils");
        System.out.printf("The rock weighs %f kilograms.%n", 5.345);    
    }
}

Trong ví dụ này, chúng ta tạo ra 2 chuỗi định dạng.

System.out.format("There are %d %s.%n", 5, "pencils");

Chúng ta có 3 định dạng. Mỗi specifier bắt đầu bằng ký tự %. Các d specifier định dạng các giá trị số nguyên. Trình định danh s định danh các giá trị chuỗi. %n xuất ra một kí tự xuống dòng; nó không đòi hỏi một đối số.

System.out.printf("The rock weighs %f kilograms.%n", 5.345);

Định danh f là số float.

Kết quả:
There are 5 pencils.
The rock weighs 5.345000 kilograms.

Argument Index

IndexPosition.java

package net.vncoding;

import java.util.Calendar;

public class IndexPosition {

    public static void main(String[] args) {

        int x = 12;
        int y = 32;
        int z = 43;

        Calendar c = Calendar.getInstance();

        System.out.format("There are %d apples, %d oranges and "
                + "%d pears%n", x, y, z);

        System.out.format("There are %2$d apples, %3$d oranges and "
                + "%1$d pears%n", x, y, z);

        System.out.format("Year: %tY, Month: %<tm, Day: %<td%n", c);
    }
}

Ví dụ này sử dụng argument index to refer tới các biến trong list argurment.

System.out.format("There are %d apples, %d oranges and "
        + "%d pears%n", x, y, z);

Nếu chúng ta không chỉ định index, các biến sẽ tự động khớp với các định dạng theo thứ tự tương ứng.
%d thứ nhất tham chiếu đến x, %d thứ 2 tham chiếu đến biến y và %d còn lại tham chiếu đến biến z.

System.out.format("There are %2$d apples, %3$d oranges and "
        + "%1$d pears%n", x, y, z);

1$, 2$, 2$ được gọi là argument index.
1$ tham chiếu đến biến x, 2$ tham chiếu đến biến y và 3$ tham chiếu đến biến z.

System.out.format("Year: %tY, Month: %<tm, Day: %<td%n", c);

Flag < khiến cho đối số của định dạng trước đó được sử dụng lại. Tất cả 3 định danh tham chiếu đến biến c. %tY cho chúng ta giá trị của năm với định dạng 4 chữa số, %tm cho giá trị tháng với định dạng 2 chữ số và %td cho ngày của tháng với định dạng 2 chữ số. Kết quả:
There are 12 apples, 32 oranges and 43 pears
There are 32 apples, 43 oranges and 12 pears
Year: 2018, Month: 03, Day: 04

Flag

Flag đi kèm với định danh tạo ra những format đặc biêt. Trong Java, có rất nhiều biến flag. Ví dụ, flag + yêu cầu ouput bao gồm dấu + cho tất cả các số dương.

Flags.java

package net.vncoding;


public class Flags {

    public static void main(String[] args) {
        
        System.out.format("%+d%n", 553);
        System.out.format("%010d%n", 553);
        System.out.format("%10d%n", 553);
        System.out.format("%-10d%n", 553);
        System.out.format("%d%n", -553);
        System.out.format("%(d%n", -553); 
    }
}
System.out.format("%+d%n", 553);

Ouput là +553

System.out.format("%010d%n", 553);

Flag 0 tạo ra định dạng với số 0 được chèn vào. 7 số 0 được chèn vào trước 553 để đủ 10 chữ số

System.out.format("%-10d%n", 553);

Flag – tạo ra định dạng căn lề trái.

System.out.format("%d%n", -553);
System.out.format("%(d%n", -553); 

Mặc định, số âm có dấu ‘-‘. Nếu chúng ta sử dụng flag ‘(‘, giá trị của số âm được đặt trong ngoặc ().

Kết quả:
+553
0000000553
553
553
-553
(553)

Trường chiều rộng

Trường chiều rộng là số ký tự tối thiểu phải được ghi vào đầu ra. Nó không thể được sử dụng cùng với dấu xuống dòng.
WidthSpecifier.java

package net.vncoding;

public class WidthSpecifier {

    public static void main(String[] args) {
        
        System.out.println(1);
        System.out.println(16);
        System.out.println(1655);
        System.out.println(16567);
        System.out.println(166701);
        
        System.out.format("%10d%n", 1);
        System.out.format("%10d%n", 16);
        System.out.format("%10d%n", 1655);
        System.out.format("%10d%n", 16567);
        System.out.format("%10d%n", 166701);                 
    }
}

– Đầu tiên, chúng ta in năm số với phương thức println() mà không chỉ rõ chiều rộng. Chiều rộng của output bằng với số ký tự được hiển thị.
– Trong trường hợp thứ hai, chúng ta có chiều rộng trường 10. Mỗi output có độ dài tối thiểu là 10 ký tự. Các chữ số được căn lề phải

Kết quả:
1
16
1655
16567
166701
1
16
1655
16567
166701

Trường độ chính xác

Trường chính xác có ý nghĩa khác nhau cho các chuyển đổi khác nhau. Đối với các loại đối số chung, độ chính xác là số ký tự tối đa cần được ghi vào đầu ra.

PrecisionSpecifier.java

package net.vncoding;


public class PrecisionSpecifier {

    public static void main(String[] args) {
    
        System.out.format("%.3g%n", 0.0000006);
        System.out.format("%.3f%n", 54.34263);
        System.out.format("%.3s%n", "Vncoding");
    }
}

Ví dụ minh họa sử dụng trường độ chính xác.

System.out.format("%.3g%n", 0.0000006);

Với %g, số thập phân 0.0000006 được convert thành kiểu số mũ: M*R^e (M: Mantissa, R: cơ số, e: số mũ). %.3g hiển thị số chữ số của phần Mantissa.

System.out.format("%.3f%n", 54.34263);

Đối dấu phẩy động, độ chính xác là số chữ số sau dấu phân cách thập phân.

System.out.format("%.3s%n", "Vncoding");

Đối với chuỗi, %.3s hiển thị 3 kí tự đầu tiên của chuỗi.

Kết quả:
6.00e-07
54.343
Vnc

Format numeric

Tiếp theo, chúng ta nói đến format numeric

FormatNumbers.java

package net.vncoding;

public class FormatNumbers {

    public static void main(String[] args) {
        
        System.out.format("%d%n", 12263);
        System.out.format("%o%n", 12263);
        System.out.format("%x%n", 12263);
        System.out.format("%e%n", 0.03452342263);
        System.out.format("%d%%%n", 45);    
    }
}

Ví dụ minh họa các format cho kiểu số.

System.out.format("%d%n", 12263);

%d định dạng số nguyên kiểu hệ cơ số 10

System.out.format("%o%n", 12263);

%o định dạng số nguyên kiểu cơ số octal

System.out.format("%x%n", 12263);

%x định dạng số nguyên kiểu hexa

System.out.format("%e%n", 0.03452342263);

%e định dạng số nguyên kiểu số mũ.

System.out.format("%d%%%n", 45); 

%% định dạng số kiểu %

Kết quả:
12263
27747
2fe7
3.452342e-02
45%

Be the first to comment

Leave a Reply