Bí mật về trong phương thức String - nohu tải game nổ hũ club
Phương kết quả bóng đá hôm nay thức String.format
là một công cụ rất quen thuộc trong lớp String của Java, giúp chúng ta thay thế các ký hiệu đại diện bằng các biến tương ứng. Ví dụ như %d
được sử dụng để làm vị trí giữ chỗ cho kiểu số nguyên, còn %s
thì dùng cho chuỗi ký tự. Tuy nhiên, mặc dù đây là một tính năng thông dụng, đôi khi chúng ta vẫn gặp phải những tình huống bất ngờ cần tìm hiểu kỹ hơn. Chẳng hạn, nếu bạn muốn viết một đoạn mã thay thế chuỗi như sau:
1public class Demo {
2 public static void main(String[] args) {
3 System.out.printf("Thành công là %d%% nỗ lực và %d%% tài năng", 99, 1);
4 }
5}
Mục tiêu ở đây là in ra câu: "Thành công là 99% nỗ lực và 1% tài năng". Dù không bàn đến tính chính xác của nội dung này, nhưng hãy cùng xem liệu đoạn mã có hoạt động bình thường hay không (chắc chắn là sẽ không).
Nếu thử chạy đoạn mã ban đầu mà không thêm dấu phần trăm kép (%%
), bạn sẽ nhận được lỗi sau:
1Exception in thread "main" java.util.UnknownFormatConversionException: Conversion = 'của'
2 at java.util.Formatter.checkText(Formatter.java:2579)
3 at java.util.Formatter.parse(Formatter.java:2555)
4 at java.util.Formatter.format(Formatter.java:2501)
5 at java.io.PrintStream.format(PrintStream.java:970)
6 at java.io.PrintStream.printf(PrintStream.java:871)
7 at demo.Demo.main(Demo.java:9)
Lỗi này xảy ra vì hàm format
sẽ phân tích chuỗi dựa trên các ký hiệu định dạng có sẵn. Nếu nó gặp một ký hiệu không hợp lệ hoặc không đúng cú pháp, chương trình sẽ báo lỗi. Để hiểu rõ hơn, ta có thể xem xét cách thức hoạt động bên trong của hàm này.
Dưới đây là một phần mã nguồn liên quan đến việc xử nohu tải game nổ hũ club lý định dạng:
1private static final String formatSpecifier
2 = "%(\\d+\\$)?([-#+ 0,(\\<]*)?(\\d+)?(\\.\\d+)?([tT])?([a-zA-Z%])";
3private static Pattern fsPattern = Pattern.compile(formatSpecifier);
4
5/**
6 * Tìm kiếm các chỉ định định dạng trong chuỗi định dạng.
7 */
8private FormatString[] parse(String s) {
9 ArrayList<FormatString> al = new ArrayList<>();
10 Matcher m = fsPattern.matcher(s);
Khi áp dụng vào ví dụ trên, hệ thống sẽ trích xuất hai phần tử định dạng hợp lệ là %d
, sau đó tiếp tục chia nhỏ chuỗi còn lại. Trong quá trình duyệt qua từng ký tự, nếu gặp một dấu %
đơn lẻ không đi kèm với các ký tự hợp lệ (như d
, s
, hoặc chính %
), hệ thống sẽ gọi phương thức checkText
để phát hiện lỗi.
Để khắc phục vấn đề này và hiển thị đúng ký hiệu %
trong kết quả cuối cùng, bạn chỉ cần sử dụng hai dấu phần trăm liên tiếp (%%
). Điều này sẽ khiến hệ thống hiểu rằng bạn muốn in ra chính ký tự %
thay vì coi nó là một phần của định dạng.
Cách viết đúng sẽ là:
1public static void main(String[] args) {
2 System.out.printf("Thành công là %d%% nỗ lực và %d%% tài năng", 99, 1);
3}
Với cách viết này, chương trình sẽ chạy suôn sẻ và in ra đúng câu mong muốn. Lưu ý rằng hai dấu phần trăm tải game nổ hũ tặng code liên tiếp (%%
) thực chất là một cách thoát (escape) để biểu diễn ký tự %
thực tế trong chuỗi định dạng.
Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về cách thức hoạt động của String.format
và cách xử lý các trường hợp đặc biệt như vậy trong lập trình Java!