JavaRush /Blog Java /Random-VI /Định dạng đầu ra của số trong Java

Định dạng đầu ra của số trong Java

Xuất bản trong nhóm
Chào mọi người! Thông thường các phương pháp của chúng tôi đi kèm với các số cần được hiển thị ở một số định dạng đặc biệt. Việc này tưởng chừng như nhỏ nhưng bạn sẽ thực hiện nhiệm vụ này như thế nào? Định dạng đầu ra của số trong Java - 1Chúng tôi mời bạn suy nghĩ về điều này một chút ngày hôm nay. Trước tiên, để đi sâu vào định dạng số trong Java, chúng ta hãy nhớ phương thức định dạng của lớp String : public static String format(String format, Object... args) - trả về một chuỗi được định dạng từ chuỗi định dạng bằng cách sử dụng các đối số args còn lại . Và chỉ là một ví dụ:
String str = String.format("Hi - %s! How are you %s?", "Sasha", "At work");
System.out.println(str);
Kết quả chúng ta sẽ nhận được kết quả đầu ra trong console:
Xin chào Sasha! Mọi việc ở nơi làm việc thế nào?

Các phương thức printf và định dạng

String.format() không phải là phương thức duy nhất để định dạng chuỗi. Các điểm tương tự của nó là System.out.printf()System.out.format(); . Vì vậy, chúng ta có thể thay thế mã trước đó bằng:
System.out.printf("Hi - %s! How are you %s?", "Sasha", "At work");
hoặc
System.out.format("Hi - %s! How are you %s?", "Sasha", "At work");
Đầu ra trong bảng điều khiển sẽ giữ nguyên. Điểm khác biệt duy nhất là các phương thức này hiển thị ngay giá trị trong bảng điều khiển, không giống như String.format() . Nhưng tôi thích String.format() hơn, vì không phải lúc nào chúng ta cũng cần hiển thị kết quả trong bảng điều khiển, vì vậy chúng ta sẽ sử dụng phương thức này thêm. Hãy quay lại ví dụ của chúng tôi. Chúng ta thấy gì? Và thực tế là ở những nơi có ký tự - %s , các dòng - “Sasha”“tại nơi làm việc” được chèn vào . Điều này có thể giúp chúng ta phát triển như thế nào? Hãy tưởng tượng rằng bạn có một văn bản mẫu lớn, nhưng ở một số nơi bạn cần chèn các giá trị có thể khác và xuất hiện dưới dạng đối số từ bên ngoài. Đây là nơi định dạng này có ích. Bộ xác định định dạng bắt đầu bằng dấu phần trăm, % và kết thúc bằng ký tự cho biết loại đối số được định dạng. Và, như bạn có thể hiểu, %s được sử dụng để chèn các đối tượng - chuỗi. Nhưng nếu chúng ta cố gắng chèn, ví dụ, một double vào nơi đăng ký đối tượng chuỗi:
String str = String.format("Hi - %s! How are you %s?", 55.6, "At work");
điều này cũng sẽ hiệu quả. double sẽ được chuyển thành một chuỗi và chúng ta sẽ nhận được:
Xin chào - 55.6! Mọi việc ở nơi làm việc thế nào?
Ngoài chuỗi và số dấu phẩy động, còn có các kiểu khác trong Java phải không? Vì vậy, chúng ta hãy xem toàn bộ kho vũ khí:
Loại giá trị để định dạng Ví dụ
%S Bất kỳ loại nào sẽ được chuyển thành chuỗi
String.format("Hi %s!","world")
Kết quả:
Chào thế giới!
%b Bất kỳ loại nào sẽ được chuyển thành boolean : true - nếu giá trị không null, false - nếu null
String.format("Hi %b!",null)
Kết quả:
Xin chào sai
% giờ Bạn có thể truyền bất kỳ đối tượng nào, đối tượng này sẽ được chuyển thành chuỗi giá trị thập lục phân từ phương thức hashCode()
String.format("Hi %h!","world")
Kết quả:
Xin chào 106c44!
%c Được sử dụng để chỉ định ký tự Unicode ( char )
String.format("Hello m%cr!",'And')
Kết quả:
Chào thế giới!
%d Một số nguyên được chỉ định ( int. byte, short, int, long, BigInteger )
String.format("I'm already %d!",20)
Kết quả:
Tôi đã 20 rồi!
%f Được sử dụng để chỉ định số dấu phẩy động
String.format("PI is - %f!", 3.14159)
Kết quả:
Số PI là - 3.141590!
%e Số dấu phẩy động trong ký hiệu khoa học
String.format("PI is - %e!", 3.14159);
Kết quả:
Số PI là - 3.141590e+00!
%Một Số dấu phẩy động sẽ được biểu diễn dưới dạng thập lục phân
String.format("PI is - %a!", 3.14159)
Kết quả:
Số PI là - 0x1.921f9f01b866ep1!
%x Một số nguyên được truyền vào ( int. byte, short, int, long, BigInteger ), kết quả định dạng sẽ là ký tự có số đã cho trong bảng ASCII
String.format("I'm already %x!",25)
Kết quả:
Tôi đã 19 rồi!
%o Một số nguyên ( int. byte, short, int, long, BigInteger ) được chấp nhận và sẽ được biểu thị dưới dạng số bát phân
String.format("I already %o!",25);
Kết quả:
Tôi đã 31 rồi!
%t Tiền tố cho chuyển đổi ngày và giờ. Cần có cờ bổ sung để định dạng
String.format("Today is %tA",new Date())
Kết quả:
Hôm nay là thứ bảy
%N Dấu phân cách dòng dành riêng cho nền tảng. Tương tự\n
String.format("Hello %n Hello")
Kết quả:
xin chào xin chào
Hãy sử dụng định dạng phù hợp hơn cho double :
String str = String.format("The distance from Kyiv to Odessa is %f. Not so short, is it?", 475.4d);
System.out.println(str);
Đầu ra của bảng điều khiển:
Khoảng cách từ Kiev tới Odessa là 475,400000. Không quá ít phải không?
Như bạn có thể đã nhận ra, %f sẽ là một công cụ xác định thích hợp hơn cho các số dấu phẩy động, bao gồm các kiểu dữ liệu như doublefloat trong Java. Với công cụ xác định này, chúng ta có thể định dạng số dấu phẩy động:
String str = String.format("The distance from Kyiv to Odessa is %.2f. Not so short, is it?", 475.4d);
Việc chèn .2 vào công cụ xác định này sẽ cắt bớt số vị trí thập phân thành hai, cho chúng ta kết quả:
Khoảng cách từ Kiev tới Odessa là 475,40. Không quá ít phải không?
.2 không phải là điều chỉnh duy nhất đối với các công cụ xác định. Sự kết hợp của các cài đặt con này được gọi là lệnh . Định dạng đầu ra của số trong Java - 2Mẫu hướng dẫn chung như sau:
Công cụ xác định loại %[argument_index][flags][width][.precision]
Bây giờ hãy giải mã mọi thứ theo thứ tự:
  • [argument_index] là số nguyên chỉ vị trí trong danh sách đối số. Ví dụ: liên kết đến đối số thứ nhất là $1, liên kết đến đối số thứ hai là $2, v.v. Nếu vị trí không được chỉ định thì các đối số phải theo cùng thứ tự như chúng được tham chiếu trong chuỗi định dạng.
  • [cờ] là các ký tự đặc biệt để định dạng. Ví dụ:
    • + cờ cho biết nếu giá trị số là dương thì nó phải bao gồm dấu +
    • - có nghĩa là căn chỉnh kết quả sang trái
    • , đặt dấu phân cách hàng nghìn cho số nguyên
  • [width] là số nguyên thập phân dương xác định số lượng ký tự tối thiểu sẽ được xuất ra. Nếu số này đứng trước số 0 thì các ký tự bị thiếu sẽ được đệm bằng 0, nếu không có số 0 thì có dấu cách.
  • [.accuracy] là số nguyên không âm đứng trước dấu chấm. Thường được sử dụng để giới hạn số lượng ký tự. Hành vi cụ thể phụ thuộc vào loại chỉ định cụ thể.
Tôi cũng muốn lưu ý rằng tất cả các yếu tố trên của hướng dẫn đều là tùy chọn và mọi thứ sẽ hoạt động nếu không có chúng. Để làm ví dụ về việc sử dụng các cài đặt con, hãy tưởng tượng rằng chúng ta cần một đầu ra cụ thể của số Pi:
String str = String.format("%1$+09.5f", 3.1415926535897);
System.out.print(str);
Và theo đó, đầu ra trong bảng điều khiển:
+03.14159
Có vẻ dễ dàng phải không? Nhưng khi nói đến định dạng số thì bạn không thể bỏ qua DecimalFormat . Chúng ta hãy tìm hiểu điều này có nghĩa là gì.

Định dạng thập phân

DecimalFormat là một lớp để định dạng bất kỳ số nào trong Java, có thể là số nguyên hoặc số dấu phẩy động. Khi một đối tượng DecimalFormat được tạo , bạn có thể chỉ định một mẫu để định dạng các số đến trực tiếp trong hàm tạo. Đây là ví dụ của chúng tôi khi sử dụng DecimalFormat :
DecimalFormat dF = new DecimalFormat( "#.###" );
double value = 72.224463;
System.out.print(dF.format(value));
Đầu ra của bảng điều khiển:
72.224
Dòng #.### là mẫu cho biết chúng ta đang định dạng giá trị được truyền thành 3 chữ số thập phân. Những biểu tượng nào khác có sẵn cho các mẫu? Dưới đây là một số trong số họ:
  • # - chữ số, số 0 đứng đầu được bỏ qua;
  • 0 — chữ số luôn được hiển thị, ngay cả khi số có ít chữ số hơn (trong trường hợp này, 0 được hiển thị);
  • . - dấu phân cách thập phân;
  • , - dấu phân cách nhóm (ví dụ, dấu phân cách hàng nghìn);
  • ; - phân tách các định dạng;
  • - — đánh dấu tiền tố của số âm;
  • % - nhân với 100 và hiển thị số dưới dạng phần trăm;
  • ? — nhân với 1000 và hiển thị số tính bằng ppm;
  • E - Phân tách phần định trị và số mũ cho ký hiệu khoa học.
Chúng ta hãy xem một vài ví dụ:
System.out.println(new DecimalFormat( "###,###.##" ).format(74554542.224463));
Đầu ra của bảng điều khiển:
74.554.542,22
System.out.println(new DecimalFormat( "%###.##" ).format(0.723456));
Đầu ra của bảng điều khiển:
%72,35
System.out.println(new DecimalFormat( "000.###" ).format(42.224463));
Đầu ra của bảng điều khiển:
042.224
Không cần thiết phải tạo đối tượng DecimalFormat mới mỗi lần để xác định mẫu mới. Chỉ cần sử dụng các phương thức applyPatternapplyLocalizedPattern của nó là đủ :
DecimalFormat dF = new DecimalFormat("###.###");
dF.applyPattern("000000.000");
dF.applyLocalizedPattern("#,#00.0#");
Khi nói về việc định dạng số dấu phẩy động, chúng ta khá quan tâm đến việc làm tròn phải không? Vì vậy, khi cắt xén một số có vị trí thập phân nằm ngoài mẫu đã chỉ định, DecimalFormat làm tròn số lên nếu số được cắt xén cuối cùng lớn hơn 5. Điều gì sẽ xảy ra nếu số được cắt xén cuối cùng là 5? Thật vậy, trong trường hợp này, con số này nằm chính xác ở giữa các số nguyên gần nhất. Định dạng đầu ra của số trong Java - 3Trong trường hợp này, số trước đó được tính đến. Nếu số trước đó là số chẵn thì việc làm tròn được thực hiện:
DecimalFormat dF = new DecimalFormat("##.###");
String result = dF.format(56.4595);
System.out.println((result));
Đầu ra của bảng điều khiển:
56.459
Nếu lẻ, nó không được thực hiện:
DecimalFormat dF = new DecimalFormat("##.###");
String str = dF.format(56.4595);
System.out.println((str));
Đầu ra của bảng điều khiển:
56.459
Sự khác biệt giữa việc định dạng số dấu phẩy động bằng String.format()DecimalFormat.format() là trong trường hợp đầu tiên sẽ có các số 0 ở cuối, ngay cả khi không có phần phân số. Ví dụ:
String firstStr = String.format("%.4f", 9.00001273);
System.out.println((firstStr));
Đầu ra của bảng điều khiển:
9,0000
DecimalFormat decimalFormat = new DecimalFormat("#.####");
String secondStr = decimalFormat.format(9.00001273);
System.out.println((secondStr));
Đầu ra của bảng điều khiển:
9
Như bạn có thể thấy, khi định dạng số 9.00001273 với độ chính xác đến bốn chữ số thập phân, phương thức format() của lớp String sẽ xuất ra giá trị 9.0000 , trong khi phương thức format() tương tự của DecimalFormat sẽ xuất ra giá trị 9 .

BigDecimal và BigInteger

Vì chúng ta đã đề cập đến chủ đề làm tròn số trong Java, hãy nói về cách sử dụng lớp BigDecimal cho các phép toán như vậy . Lớp này tập trung vào làm việc với các số thực sự LỚN: đối với nó, các giá trị doublefloat tối đa là quá nhỏ. Lớp này có nhiều cài đặt khác nhau để làm tròn dấu phẩy động, cũng như nhiều phương thức cho các phép tính số học. Nó có một lớp tương tự, nhưng tập trung vào làm việc với các số nguyên LARGE - BigInteger . Bạn có thể đọc thêm về BigDecimalBigInteger trong bài viết này .

Định dạng ngày và giờ

Ở trên chỉ đề cập rằng bằng cách sử dụng format() của lớp String , bạn cũng có thể định dạng ngày và giờ. Định dạng đầu ra của số trong Java - 4Nào, chúng ta hãy xem nó được thực hiện như thế nào. Trước tiên, chúng tôi muốn nhắc bạn rằng công cụ xác định định dạng %t được sử dụng cho ngày tháng . Thứ hai, khi định dạng một mẫu, cần có các cờ định dạng bổ sung cho từng bộ chỉ định định dạng cho ngày tháng. Dưới đây là các cờ định dạng có thể có cho ngày tháng:
Cờ Sự miêu tả
%tB Tên đầy đủ của tháng, ví dụ: tháng 1, tháng 2, v.v.
%tb Tên viết tắt của tháng, ví dụ: Jan, Feb, v.v.
%tA Tên đầy đủ của ngày trong tuần, ví dụ Chủ Nhật, Thứ Hai
%ta Tên viết tắt của ngày trong tuần, ví dụ Sun, Mon, v.v.
%tY Năm ở định dạng 4 chữ số, ví dụ 0000 đến 9999
%ty Năm ở định dạng 2 chữ số, ví dụ từ 00 đến 99
%tm Tháng được định dạng bằng 0 ở đầu, ví dụ 01 đến 12
%tc Ngày và giờ ở định dạng %ta %tb %td %tT %tZ %tY, ví dụ: Thứ Hai ngày 17 tháng 2 03:56:12 PST 2020
%tD Ngày ở định dạng %tm/%td/%ty
%td Ngày trong tháng ở định dạng hai chữ số, ví dụ 01 đến 31
%te Ngày trong tháng ở định dạng không có số 0 đứng đầu, ví dụ từ 1 đến 31
%tT Thời gian ở định dạng 24 giờ, ví dụ %tH:%tM:%tS
%quần què Giờ trong ngày ở định dạng 24 giờ, từ 00 đến 23
%tI Giờ trong ngày cho định dạng 12 giờ, ví dụ: 01 đến 12
%tM Số phút trong giờ được định dạng bằng số 0 đứng đầu, ví dụ 00 đến 59
%tS Giây trong một phút, bao gồm hai chữ số, ví dụ từ 00 đến 59
%tZ Viết tắt múi giờ, chẳng hạn như PST, UTC, v.v.
Đây là danh sách rút gọn các cờ định dạng ngày có thể có - có rất nhiều cờ, phù hợp với mọi sở thích. Bạn có thể tìm thấy danh sách đầy đủ về chúng và các thông số xác định có thể có tại liên kết này . Hãy xem cách sử dụng cái này. Lần này chúng ta không sử dụng String.format() mà sử dụng ngay System.out.printf() .

ví dụ 1

Ngoài ra, chúng tôi sẽ đặt ngôn ngữ kết quả bằng cách chuyển nó làm đối số đầu tiên cho phương thức:
Date date = new Date();
System.out.printf(Locale.ENGLISH,"%tB %te, %tY",date,date,date);
Đầu ra của bảng điều khiển:
Ngày 11 tháng 10 năm 2020
Nếu không chỉ định ngôn ngữ, ngôn ngữ mặc định sẽ được sử dụng (ví dụ: tôi có tiếng Nga).

Ví dụ 2

Hãy hiển thị một ngày đầy đủ hơn:
Date date = new Date();
System.out.printf("%td %tB %tY of %n%tH:%tM:%tS",date,date,date,date,date,date,date);
Và đầu ra trong bảng điều khiển:
Ngày 11 tháng 10 năm 2020 13:43:22
Truyền cùng một đối tượng Date làm đối số rất nhiều lần... Trông không đẹp lắm phải không? Hãy sử dụng tập hợp con $ nội bộ để chỉ định đối số mà chúng ta muốn sử dụng:
System.out.printf("%1$td %1$tB %1$tY of year %n%1$tH:%1$tM:%1$tS",date);
Đầu ra trong bảng điều khiển của chúng tôi sẽ không thay đổi. Có nhiều cách thú vị không kém khác để định dạng ngày tháng. Bạn có thể đọc về chúng và biết thêm một chút về thời gian và ngày tháng trong Java trong tài liệu này . Đó là tất cả cho ngày hôm nay, cảm ơn sự quan tâm của bạn!Định dạng đầu ra của số trong Java - 5
Bình luận
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION