Làm cách nào để chuyển đổi từ int sang String?


745

Tôi đang làm việc trên một dự án mà tất cả các chuyển đổi từ intđể Stringđược thực hiện như thế này:

int i = 5;
String strI = "" + i;

Tôi không quen thuộc với Java.

Đây có phải là thông lệ hoặc là một cái gì đó sai, như tôi cho là?


47
Cách "ngớ ngẩn, dễ dàng" là chuỗi = "" + số nguyên;
Fattie


2
Tôi chỉ có nghĩa là, đó là một cách "nhanh chóng, đơn giản" để làm điều đó. nó hơi ngớ ngẩn nhưng nó hoạt động!
Fattie

1
Một đồng nghiệp của tôi đã làm Integer.valueOf(i).toString(). Anh ta hẳn là thích đồ vật. Trong khi nó nói rất rõ ý định của anh ta, nó hơi dài đối với sở thích của tôi.
Ole VV

5
Bạn chỉ cần 45 dòng mã và thực hiện 7 giao diện để thực hiện.
Ska

Câu trả lời:


958

Những cách thông thường sẽ là Integer.toString(i)hoặc String.valueOf(i).

Sự kết hợp sẽ có hiệu quả, nhưng nó là độc đáo và có thể là một mùi hôi vì nó cho thấy tác giả không biết về hai phương pháp trên (những gì họ có thể không biết?).

Java có hỗ trợ đặc biệt cho toán tử + khi được sử dụng với các chuỗi (xem tài liệu ) dịch mã bạn đã đăng vào:

StringBuilder sb = new StringBuilder();
sb.append("");
sb.append(i);
String strI = sb.toString();

tại thời gian biên dịch. Nó hơi kém hiệu quả ( sb.append()kết thúc cuộc gọi Integer.getChars(), đó là những gì Integer.toString()sẽ làm dù sao), nhưng nó hoạt động.

Để trả lời nhận xét của Grodriguez: ** Không, trình biên dịch không tối ưu hóa chuỗi trống trong trường hợp này - xem:

simon@lucifer:~$ cat TestClass.java
public class TestClass {
  public static void main(String[] args) {
    int i = 5;
    String strI = "" + i;
  }
}
simon@lucifer:~$ javac TestClass.java && javap -c TestClass
Compiled from "TestClass.java"
public class TestClass extends java.lang.Object{
public TestClass();
  Code:
   0:    aload_0
   1:    invokespecial    #1; //Method java/lang/Object."<init>":()V
   4:    return

public static void main(java.lang.String[]);
  Code:
   0:    iconst_5
   1:    istore_1

Khởi tạo StringBuilder:

   2:    new    #2; //class java/lang/StringBuilder
   5:    dup
   6:    invokespecial    #3; //Method java/lang/StringBuilder."<init>":()V

Nối chuỗi trống:

   9:    ldc    #4; //String
   11:    invokevirtual    #5; //Method java/lang/StringBuilder.append:
(Ljava/lang/String;)Ljava/lang/StringBuilder;

Nối số nguyên:

   14:    iload_1
   15:    invokevirtual    #6; //Method java/lang/StringBuilder.append:
(I)Ljava/lang/StringBuilder;

Trích xuất chuỗi cuối cùng:

   18:    invokevirtual    #7; //Method java/lang/StringBuilder.toString:
()Ljava/lang/String;
   21:    astore_2
   22:    return
}

một đề xuất và công việc đang diễn ra để thay đổi hành vi này, được nhắm mục tiêu cho JDK 9.


9
Trình biên dịch jit trong jvm thì sao? :-) javac không thực hiện bất kỳ tối ưu hóa ưa thích nào.
Peter tibraný

5
Ai biết được :) javac không tối ưu hóa các loại biểu thức này khi sử dụng chữ số, mặc dù (ví dụ: "" + 5trở thành "5").
SimonJ

5
Vâng, nhưng tại sao bạn sẽ làm "" + 5thay vì chỉ "5"?
Grungondola

3
Đẹp! +1 cho những gì họ có thể không biết?
Sнаđошƒаӽ 17/2/2016

2
Cách "" + integertiếp cận được sử dụng trong một trong những hướng dẫn chính thức .
Tomasz Nocoń

252

Có thể chấp nhận được, nhưng tôi chưa bao giờ viết bất cứ điều gì như thế. Tôi thích điều này:

String strI = Integer.toString(i);

101
Tôi thích cách tiếp cận String.valueOf, vì bạn có thể sử dụng cùng một lệnh gọi cho bất kỳ loại nào.
Jon Skeet

1
NumberFormatter sẽ là một cách tiếp cận tốt hơn
Kasturi

Một câu trả lời tốt, Kasturi. Tôi sẽ đăng nó như một cái gì đó nhiều hơn một bình luận.
duffymo

2
Xin lỗi vì sự thiếu hiểu biết của tôi, nhưng điều này sẽ không sử dụng văn hóa hiện tại? Tôi sắp thành một nền tảng .NET BTW.
Ε é И

3
Đối với một số nguyên, không có nội dung cụ thể về văn hóa nào được sử dụng theo mặc định (hoàn toàn không có dấu phân cách hoặc hàng nghìn). Đó là những gì NumberFormatterdành cho. Bạn có thể sử dụng các định dạng như NumberFormat.getInstance(Locale.FRENCH).
Kat

111

Đó không phải là một cách tốt.

Khi thực hiện chuyển đổi từ int sang chuỗi, nên sử dụng:

int i = 5;
String strI = String.valueOf(i);

7
1. Bạn yêu cầu chuỗi trống; 2. Bạn yêu cầu nối; 3. vì bạn không có chuỗi, cuối cùng bạn sẽ chuyển int thành chuỗi. Các giải pháp của daridoo tránh các bước đầu tiên.
Nicolas

int iđược đóng hộp vào một Integertrước khi được thêm vào String strI?
Kevin Meredith

1
@KevinMeredith, không, không. Bạn thực sự đang gọi StringBuilder.append(int)(và StringBuildercó một appendphương thức cho tất cả các kiểu nguyên thủy).
Kat

60

Đó không chỉ là tối ưu hóa 1 . Tôi không thích

"" + i

bởi vì nó không thể hiện những gì tôi thực sự muốn làm 2 .

Tôi không muốn nối một số nguyên vào một chuỗi (trống). Tôi muốn chuyển đổi một số nguyên thành chuỗi:

Integer.toString(i)

Hoặc, không phải là sở thích của tôi, nhưng vẫn tốt hơn so với ghép, lấy biểu diễn chuỗi của một đối tượng (số nguyên):

String.valueOf(i)

1. Đối với mã được gọi rất thường xuyên, như trong các vòng lặp, tối ưu hóa chắc chắn cũng là một điểm không sử dụng phép nối .

2. điều này không hợp lệ để sử dụng phép nối thực như trong System.out.println("Index: " + i); hoặc String id = "ID" + i;


3
Những người đang nói về hiệu suất trong bối cảnh này là một sự xao lãng. Xa, xa, xa, xa, xa, xa, quan trọng hơn nhiều là khả năng đọc .
Brian Goetz

23

Rất nhiều khóa học Đại học giới thiệu dường như dạy phong cách này, vì hai lý do (theo kinh nghiệm của tôi):

  • Nó không đòi hỏi sự hiểu biết về các lớp hoặc phương thức. Thông thường, điều này được dạy theo cách trước khi từ ngữ lớp Class được nhắc đến - thậm chí cả các cuộc gọi phương thức. Vì vậy, sử dụng một cái gì đó như String.valueOf(…)sẽ gây nhầm lẫn cho sinh viên.

  • Đó là một minh chứng “điều hành quá tải” - trong thực tế, điều này đã được bán cho chúng ta như các nhà khai thác quá tải thành ngữ (kỳ quan nhỏ ở đây, vì Java không cho phép nhà khai thác quá tải tùy chỉnh).

Vì vậy, nó có thể được sinh ra từ sự cần thiết của mô phạm (mặc dù tôi cho rằng đây chỉ là cách dạy tồi) hoặc được sử dụng để minh họa một nguyên tắc mà khá khó để thể hiện trong Java.


2
tôi nghĩ rằng trên các cấu trúc trái ngược như "" + tôi sẽ nhầm lẫn người mới. Và đó cũng là một phong cách tồi tệ cho phần còn lại của cuộc đời họ.
Konstantin Zyubin

15

Cách diễn đạt

"" + i

dẫn đến chuyển đổi chuỗi trong ithời gian chạy. Loại tổng thể của biểu thức là String. iđầu tiên được chuyển đổi thành một Integerđối tượng ( new Integer(i)), sau đó String.valueOf(Object obj)được gọi. Vì vậy, nó tương đương với

"" + String.valueOf(new Integer(i));

Rõ ràng, điều này là ít hiệu quả hơn so với chỉ gọi String.valueOf(new Integer(i))sẽ tạo ra kết quả rất giống nhau.

Ưu điểm của ""+iviệc gõ là dễ dàng hơn / nhanh hơn và một số người có thể nghĩ rằng nó dễ đọc hơn. Nó không phải là một mùi mã vì nó không chỉ ra vấn đề sâu hơn.

(Tham khảo: JLS 15.8.1 )


3
Tuyên bố "tương đương" của bạn không tương đương. Ngay cả khi gọi String.valueOfquyền anh yêu cầu i(không, vì có quá tải chấp nhận int), nó sẽ không sử dụng new Integer(i), nó sẽ sử dụng Integer.valueOf(i). Nhưng nó thực sự không làm gì trong số này. Nó làm new StringBuilder().append("").append(i).toString(), như câu trả lời của SimonJ. StringBuilder có logic riêng để biến int nguyên thủy ithành String.
Mark Peters

4
Mặc dù vậy, phần về mùi mã là đúng; Mùi mã là thuật ngữ sai ở đây. Vì vậy, tôi sẽ gỡ xuống downvote.
Mark Peters

Có vẻ không hiệu quả để làm điều đó với "" + i. Chỉ nên sử dụng Integer.toString hoặc String.valueOf đơn giản. Xem javadevnotes.com/java-integer-to-opes-examples
JavaDev 15/2/2015

14

Cá nhân, tôi không thấy bất cứ điều gì xấu trong mã này.

Nó khá hữu ích khi bạn muốn đăng nhập một giá trị int và logger chỉ chấp nhận một chuỗi. Tôi muốn nói rằng một chuyển đổi như vậy là thuận tiện khi bạn cần gọi một phương thức chấp nhận Chuỗi, nhưng bạn có một giá trị int.

Đối với sự lựa chọn giữa Integer.toStringhoặc String.valueOf, tất cả là vấn đề của hương vị.
... Và trong nội bộ, nhân tiện String.valueOfgọi Integer.toStringphương thức này. :)


12

Một cách khác tôi nhận thức được là từ Integerlớp học:

Integer.toString(int n);
Integer.toString(int n, int radix);

Một ví dụ cụ thể (mặc dù tôi không nghĩ bạn cần bất kỳ):

String five = Integer.toString(5); // returns "5"

Nó cũng hoạt động cho các loại nguyên thủy khác, ví dụ Double.toString.

Xem ở đây để biết thêm chi tiết.


9

Kỹ thuật này đã được dạy trong một lớp học giới thiệu về Java cấp độ đại học mà tôi đã học hơn một thập kỷ trước. Tuy nhiên, tôi cần lưu ý rằng, IIRC, chúng ta chưa nhận được các phương thức lớp String và Integer.

Kỹ thuật này là đơn giản và nhanh chóng để gõ. Nếu tất cả những gì tôi đang làm là in một cái gì đó, tôi sẽ sử dụng nó (ví dụ: System.out.println("" + i);Tuy nhiên, tôi nghĩ rằng đó không phải là cách tốt nhất để thực hiện chuyển đổi, vì phải mất một giây suy nghĩ để nhận ra điều gì đang xảy ra khi nó được sử dụng theo cách này. Ngoài ra, nếu hiệu suất là một mối quan tâm, nó có vẻ chậm hơn (nhiều hơn bên dưới, cũng như trong các câu trả lời khác).

Cá nhân, tôi thích Integer.toString (), vì rõ ràng những gì đang xảy ra. String.valueOf () sẽ là lựa chọn thứ hai của tôi, vì nó có vẻ khó hiểu (chứng kiến ​​các bình luận sau câu trả lời của darioo).

Chỉ dành cho grins :) Tôi đã viết lên các lớp để kiểm tra ba kỹ thuật: "" + i, Integer.toString và String.ValueOf. Mỗi bài kiểm tra chỉ chuyển đổi các số nguyên từ 1 đến 10000 thành Chuỗi. Sau đó tôi chạy từng lệnh thông qua lệnh thời gian Linux năm lần. Integer.toString () nhanh hơn một chút so với String.valueOf (), họ đã buộc ba lần và String.valueOf () nhanh hơn một lần; tuy nhiên, sự khác biệt không bao giờ nhiều hơn một vài phần nghìn giây.

Kỹ thuật "" + i chậm hơn cả hai trên mọi thử nghiệm trừ một lần, khi nó nhanh hơn 1 mili giây so với Integer.toString () và chậm hơn 1 mili giây so với String.valueOf () (rõ ràng trong cùng một thử nghiệm trong đó String.valueOf () đã nhanh hơn Integer.toString ()). Mặc dù nó thường chậm hơn vài mili giây, nhưng có một thử nghiệm trong đó chậm hơn khoảng 50 mili giây. YMMV .


1
Đừng quên đưa JIT vào tài khoản - một vài chuyển đổi đầu tiên sẽ chậm hơn nhiều và làm sai lệch thời gian. Trên MacBook của tôi, quá trình ghép nối mất hơn 20 giây so với hai phương thức còn lại (cả hai đều mất ~ 50ns cho mỗi chuyển đổi), do đó, sự khác biệt bạn thấy theo thứ tự ms có thể là do lỗi ngẫu nhiên (lập lịch, ngắt, v.v.).
SimonJ

6

Có nhiều cách khác nhau để chuyển đổi thành Chuỗi:

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);

StringBuilder chuỗi = string.append (i) .toString (); ... Hừm, vậy nó là StringBuilder hay String? Một số mớ hỗn độn ở đây ...
Franta

6

Nó phụ thuộc vào cách bạn muốn sử dụng Chuỗi của bạn. Điều này có thể giúp:

String total =  Integer.toString(123) + Double.toString(456.789);

5

Chủ yếu là ditto trên SimonJ. Tôi thực sự không thích thành ngữ "" + i. Nếu bạn nói String.valueOf (i), Java sẽ chuyển đổi số nguyên thành một chuỗi và trả về kết quả. Nếu bạn nói "" + i, Java sẽ tạo một đối tượng StringBuilder, nối thêm một chuỗi trống vào nó, chuyển đổi số nguyên thành chuỗi, nối nó với StringBuilder, sau đó chuyển StringBuilder thành String. Đó là rất nhiều bước thêm. Tôi cho rằng nếu bạn làm điều đó một lần trong một chương trình lớn, thì đó không phải là vấn đề lớn. Nhưng nếu bạn đang làm điều này mọi lúc, bạn đang làm cho máy tính thực hiện một loạt công việc phụ và tạo ra tất cả các đối tượng bổ sung này sau đó phải được dọn sạch. Tôi không muốn cuồng tín về tối ưu hóa vi mô, nhưng tôi cũng không muốn lãng phí một cách vô nghĩa.


5
String strI = String.valueOf(i);

String string = Integer.toString(i);

Cả hai cách đều đúng.


5

Có nhiều cách để chuyển đổi một số nguyên thành một chuỗi:

1)

Integer.toString(10);

2)

 String hundred = String.valueOf(100); // You can pass an int constant
 int ten = 10;
 String ten = String.valueOf(ten)

3)

String thousand = "" + 1000; // String concatenation

4)

String million = String.format("%d", 1000000)

1
String.format ("% d", 1000000) ... Đây không thực sự là Int >> Chuyển đổi chuỗi, đây đúng là Chuỗi >> Xử lý chuỗi ở đây, mặc dù đã quá tải. Vì vậy, tôi không giới thiệu và điều này. Chắc chắn không nhằm mục đích chuyển đổi.
Franta

5

Có ba cách để chuyển đổi thành Chuỗi

  1. String string = "" + i;
  2. String string = String.valueOf(i);
  3. String string = Integer.toString(i);

1
Bạn đã quên : String.format("%d", i).
Brian Goetz

3

Sử dụng "" + i là cách ngắn nhất và đơn giản nhất để chuyển đổi số thành chuỗi. Nó không phải là hiệu quả nhất, nhưng nó là IMHO rõ ràng nhất và điều đó thường quan trọng hơn. Mã càng đơn giản, bạn càng ít có khả năng mắc lỗi.


2
Làm thế nào một người có thể mắc lỗi khi gọi String.valueOf hoặc Integer.toString?
Eva

1
Tôi đã bắt gặp một vài cách sử dụng String.valueOf () không lý tưởng nhưng bây giờ tôi không thể nhớ chúng. Trong khi đầu ra là chính xác, nó kém hiệu quả hơn""+i
Peter Lawrey

2

Cá nhân tôi nghĩ rằng "" + tôi trông giống như poster câu hỏi ban đầu nói "có mùi". Tôi đã sử dụng rất nhiều ngôn ngữ OO bên cạnh Java. Nếu cú ​​pháp đó được dự định là phù hợp thì Java sẽ chỉ giải thích i một mình mà không cần "" như mong muốn được chuyển đổi thành một chuỗi và làm điều đó vì loại đích không rõ ràng và chỉ có một giá trị duy nhất được cung cấp ở bên phải . Cái kia có vẻ như là một 'mánh khóe' để đánh lừa trình biên dịch, mojo xấu khi các phiên bản Javac khác nhau được tạo bởi các nhà sản xuất khác hoặc từ các nền tảng khác được xem xét nếu mã cần được chuyển. Heck đối với tiền của tôi, nó giống như nhiều OOL khác mất một kiểu chữ: (Chuỗi) i. nháy mắt

Theo cách học của tôi và để dễ hiểu cấu trúc như vậy khi đọc mã người khác một cách nhanh chóng, tôi bỏ phiếu cho phương thức Integer.toString (i). Quên một hoặc hai ns về cách Java triển khai mọi thứ trong nền so với String.valueOf (i) phương thức này phù hợp với tôi và nói chính xác những gì đang xảy ra: Tôi có và Integer và tôi muốn nó được chuyển đổi thành Chuỗi.

Một điểm tốt được thực hiện một vài lần có lẽ chỉ là sử dụng StringBuilder lên phía trước là một câu trả lời tốt cho việc xây dựng Chuỗi pha trộn giữa văn bản và int hoặc các đối tượng khác vì đó sẽ là những gì sẽ được sử dụng trong nền dù sao phải không?

Chỉ hai xu của tôi ném vào con mèo đã được trả nhiều tiền cho câu trả lời cho câu hỏi Mans ... những nụ cười

CHỈNH SỬA CÂU TRẢ LỜI CỦA TÔI SAU MỘT SỐ GIỚI HẠN:

Ok, Ok, tôi đã suy nghĩ thêm về điều này và String.valueOf (i) cũng hoàn toàn tốt khi nó nói: Tôi muốn một Chuỗi đại diện cho giá trị của một Integer. lol, tiếng Anh khó phân tích hơn Java rồi! Nhưng, tôi để phần còn lại của câu trả lời / nhận xét của mình ... Tôi luôn được dạy sử dụng mức thấp nhất của chuỗi phương thức / hàm nếu có thể và vẫn duy trì tính dễ đọc vì vậy nếu String.valueOf gọi Integer.toString thì Tại sao phải sử dụng toàn bộ màu cam Nếu bạn chỉ bóc nó bằng mọi cách, Hmmm?

Để làm rõ nhận xét của tôi về StringBuilder, tôi xây dựng rất nhiều chuỗi với các tổ hợp chủ yếu là văn bản và chữ int và chúng kéo dài và xấu xí với các cuộc gọi đến các thói quen được đề cập ở trên được đặt giữa các +, vì vậy dường như chúng sẽ trở thành Dù sao thì các đối tượng SB và phương thức chắp thêm đã quá tải, có thể sẽ dễ dàng hơn nếu cứ tiếp tục và sử dụng nó ... Vì vậy, tôi đoán bây giờ tôi đã lên tới 5 xu cho cái này, eh? cười lớn...


-1

sử dụng Integer.toString(tmpInt).trim();


Thực sự không có tình huống trim()nào sẽ được sử dụng ở đây.
Dorian Gray

-5

Hãy thử kiểu chữ đơn giản

char c = (char) i;

3
Đây không phải là một cách tốt để chuyển đổi một int thành một chuỗi. Trên thực tế, bạn không chuyển đổi một int thành một chuỗi, bạn đang chuyển đổi một int thành một char. Điều này sẽ diễn giải int dưới dạng mã ký tự ASCII và cung cấp cho bạn char đó. Đó là nguy hiểm (giá trị âm, v.v.) và nói chung chỉ sai.
Nepoxx

Vui lòng xóa câu hỏi trên, char và String đều khác nhau ...!

nhưng điều này hoạt động (bảng mã ASCII "bù"):char c = (char) (i + 48);
electrobabe
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.