Tại sao Apache Commons coi '१२३' là số?


101

Theo tài liệu của Apache Commons Lang cho StringUtils.isNumeric(), Chuỗi '१२३' là số.

Vì tôi tin rằng đây có thể là một sai sót trong tài liệu, tôi đã chạy thử nghiệm để xác minh tuyên bố. Tôi thấy rằng theo Apache Commons thì nó số.

Tại sao chuỗi này là số? Những ký tự đó thể hiện điều gì


61
Có lẽ chúng đại diện cho các chữ số trong một số ngôn ngữ. Không phải tất cả các ngôn ngữ đều sử dụng các ký hiệu từ 0 đến 9 để biểu diễn các chữ số.
Eran

165
đây là 1, 2 và 3 trong tiếng Hin-ddi
Blip

11
Bạn có thể nhận giá trị số nguyên bằng Integer.parseInt("१२३").
saka1029

9
@ dan04 Đó không phải là số, đó là những chữ cái phổ biến để biểu thị các hằng số cụ thể. Lưu ý sự khác biệt giữa ⅯⅭMC.
gerrit,

Câu trả lời:


198

Bởi vì "CharSequence chỉ chứa các chữ số Unicode" (trích dẫn tài liệu được liên kết của bạn ).

Tất cả các ký tự đều trả về true cho Character.isDigit:

Một số phạm vi ký tự Unicode có chứa các chữ số:

  • '\ u0030' đến '\ u0039', chữ số ISO-LATIN-1 ('0' đến '9')
  • '\ u0660' đến '\ u0669', chữ số Ả Rập-Ấn Độ
  • '\ u06F0' đến '\ u06F9', các chữ số Ả Rập-Ấn Độ mở rộng
  • '\ u0966' đến '\ u096F', chữ số Devanagari
  • '\ uFF10' đến '\ uFF19', chữ số toàn chiều rộng

Nhiều phạm vi ký tự khác cũng chứa các chữ số.

१२३ là các chữ số Devanagari:


11
@Joker_vD tốt, bạn đã không quy định mà tình trạng quá tải, vì vậy yes, sure: Integer.parseInt("222", 2).
Andy Turner

4
@Joker_vD Nó thậm chí không khó; có nhiều ngôn ngữ không được hỗ trợ. Ngay cả khi vậy, vẫn có Chinise 亿, đại diện cho 10 ^ 8 -> điều này với sức mạnh của 3 sẽ gây ra tràn. Danh sách hệ thống số
Cedric Reichenbach

13
@CedricReichenbach: Điểm khác biệt chính là mặc dù 亿 là số (theo tiêu chuẩn của việc có một trong các giá trị không phải Không có của Numeric_Type, trong trường hợp này là Numeric_Type = Numeric), nó không phải là bất kỳ loại chữ số nào . (Ngay cả khi đúng như vậy, bạn sẽ không tính đến lũy thừa của 3; bạn sẽ nâng cơ số lên nhiều lũy thừa khác nhau, chứ không phải các chữ số .) parseIntYêu cầu chữ số và có lẽ gây nhầm lẫn, isNumericphương pháp trong câu hỏi này kiểm tra các ký tự chữ số thập phân ( General_Category = Decimal_Number) thay vì bất kỳ danh mục ký tự số nào rộng hơn.
user2357112 hỗ trợ Monica

10
Bộ chữ số Devangari hoàn chỉnh là ०१२३४५६७८९.
dan04

2
@ v7d8dpo4 (s) anh ấy hỏi liệu có cách nào Integer.parseInt()để ném ngoại lệ cho chuỗi nhập số 3 ký tự không.
Andy Turner

59

Ký hiệu १२३ giống với 123 đối với ngôn ngữ Nepal hoặc bất kỳ ngôn ngữ nào khác sử dụng hệ thống chữ Devanagari như tiếng Hindi, Gujarati, v.v. và do đó là một số cho Apache Commons.


3
Thứ đó gần giống như "123" trong các chữ số Ả Rập.
Panzercrisis

41
Người Ả Rập lấy chữ số của họ từ người da đỏ.

5
@rahul Các số Ả Rập là 1-9, không phải ١-٩ như người ta thường nghĩ.
Maroun

26

Bạn có thể sử dụng Character#getTypeđể kiểm tra danh mục chung của nhân vật:

System.out.println(Character.DECIMAL_DIGIT_NUMBER == Character.getType('१'));

Điều này sẽ in ra true, đó là "bằng chứng" rằng '१' là một chữ số .

Bây giờ chúng ta hãy kiểm tra giá trị unicode của ký tự '१':

System.out.println(Integer.toHexString('१'));
// 967

Con số này nằm trên dải chữ số Devanagari - đó là: \u0966qua \u096F.

Cũng cố gắng:

Character.UnicodeBlock block = Character.UnicodeBlock.of('१');
System.out.println(block.toString());
// DEVANAGARI

Devanagari là:

là một bảng chữ cái abugida (bảng chữ cái) của Ấn Độ và Nepal

"१२३" là "123" (Mã unicode tiếng Latinh cơ bản).

Đọc hiểu:


1
Điều quan trọng hơn là chúng thuộc loại DECIMAL_DIGIT_NUMBERhơn là chúng nằm trong DEVANAGARIkhối. Có cả các chữ cái không phải chữ số trong khối đó.
Andy Turner

23

Nếu bạn muốn biết một "ký tự" cụ thể có những thuộc tính nào (và có khá nhiều), hãy truy cập trực tiếp vào nguồn: Unicode.org . Họ có các công cụ nghiên cứu có thể cho bạn thấy hầu hết mọi thứ mà bạn muốn biết.

LƯU Ý: Unicode Consortium sản xuất một đặc điểm kỹ thuật, không phải phần mềm. Điều này có nghĩa là tùy thuộc vào mỗi nhà cung cấp phần mềm để triển khai các đặc tả chính xác nhất có thể . Vì vậy, cũng giống như HTML, JavaScript, CSS, SQL, v.v., có sự thay đổi giữa các nền tảng, ngôn ngữ khác nhau, v.v. Ví dụ: tôi đã tìm thấy lỗi trong .NET Framework của Microsoft, theo đó khoanh tròn các chữ cái Latinh A-Za-z- Điểm mã 0x24B6 đến 0x24E9 - không đăng ký đúng cách char.IsLetter = true( báo cáo lỗi tại đây ). Và điều đó dẫn đến hành vi không mong muốn trong chức năng liên quan, chẳng hạn như khi gọi TextInfo.ToTitleCase()phương thức ( báo cáo lỗi ở đây ).


1
Tài liệu tham khảo tuyệt vời! (Mặc dù họ làm làm cho tôi tự hỏi, nếu Unicode đã đi qua đỉnh!)
PJTraill

1
Nếu bạn muốn có sẵn loại tham chiếu này cục bộ, bạn có thể cài đặt uniprops .
TRiG

2
@TRiG Cảm ơn bạn đã đề cập đến điều đó. Tiện ích thú vị. Nó bao gồm một số chức năng được hiển thị trong 3 liên kết đầu tiên (tập hợp gốc), nhưng tôi vừa cập nhật câu trả lời của mình để bao gồm một số liên kết bổ sung hiển thị các truy vấn nâng cao hơn có thể được thực hiện trên Unicode.org mà tôi không thấy có thể thông qua uniprops. Ngoài ra, có vẻ như đó unipropslà một phiên bản sau khi Unicode phát hành phiên bản 9.0 vào tháng 6 vừa qua.
Solomon Rutzky

19

Các ký hiệu '१२३' thực sự có nguồn gốc từ tiếng Hindi (Về cơ bản từ ngôn ngữ Phạn ngữ tức là Devanagiri) đại diện cho các giá trị số giống như:

१ đại diện cho 1

२ đại diện cho 2

Và tương tự


4
SỬA CHỮA: Biểu tượng '123' đang thực sự có nguồn gốc từ tiếng Phạn ngôn ngữ (ví dụ, Devanagiri kịch bản như áp phích khác đã ghi nhận)
Chúc mừng Xanh Kid NAP

Tôi đã rất ngạc nhiên khi biết Devanāgarī gần đây đã có hình dạng như hiện tại như thế nào - nhiều thế kỷ sau khi tiếng Phạn được hệ thống hóa! Vì vậy, tôi hoài nghi tuyên bố rằng các chữ số thuộc về tiếng Phạn nhiều hơn là văn hóa Ấn Độ nói chung.
Anton Sherwood
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.