ฉันจะแปลงจาก int เป็น String ได้อย่างไร


745

ฉันกำลังทำงานในโครงการที่การแปลงทั้งหมดเป็นintถึงStringเป็นดังนี้:

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

ฉันไม่คุ้นเคยกับ Java

นี่คือการปฏิบัติตามปกติหรือเป็นสิ่งผิดปกติอย่างที่ฉันคิด


47
วิธี"โง่ง่าย"คือ string = "" + จำนวนเต็ม;
Fattie

1
เอกสารที่ดี: [ javarevisited.blogspot.de/2011/08/เป็นต้นตัวอย่าง
Narayan Yerrabachu

2
ฉันแค่หมายถึงมันเป็นวิธีที่ "เร็วง่าย" มันค่อนข้างโง่ แต่ก็ใช้งานได้!
Fattie

1
Integer.valueOf(i).toString()เพื่อนร่วมงานของผมได้ เขาจะต้องชอบวัตถุ ในขณะที่มันแสดงความตั้งใจของเขาอย่างชัดเจนมันค่อนข้างยาวสำหรับรสนิยมของฉัน
Ole VV

5
คุณต้องการโค้ด 45 บรรทัดและใช้งานอินเทอร์เฟซ 7 รายการเพื่อดำเนินการ
สกา

คำตอบ:


958

วิธีปกติจะเป็นหรือInteger.toString(i)String.valueOf(i)

การต่อเรียงจะใช้งานได้ แต่ก็ไม่เป็นทางการและอาจมีกลิ่นเหม็นตามที่แนะนำว่าผู้เขียนไม่ทราบเกี่ยวกับวิธีการสองวิธีข้างต้น

Java มีการสนับสนุนพิเศษสำหรับตัวดำเนินการ + เมื่อใช้กับสตริง (ดูเอกสารประกอบ ) ซึ่งแปลรหัสที่คุณโพสต์ลงใน:

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

ในเวลารวบรวม มีประสิทธิภาพน้อยกว่าเล็กน้อย ( sb.append()จบลงด้วยการโทรInteger.getChars()ซึ่งเป็นสิ่งที่Integer.toString()จะทำต่อไป) แต่ใช้งานได้

เพื่อตอบความคิดเห็นของ Grodriguez: ** ไม่คอมไพเลอร์ไม่ปรับสตริงว่างในกรณีนี้ให้ดูที่:

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

เริ่มต้น StringBuilder:

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

ต่อท้ายสตริงว่าง:

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

ผนวกจำนวนเต็ม:

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

แยกสตริงสุดท้าย:

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

มีข้อเสนอและการทำงานอย่างต่อเนื่องเพื่อเปลี่ยนพฤติกรรมนี้โดยมีเป้าหมายสำหรับ JDK 9


9
สิ่งที่เกี่ยวกับ jit คอมไพเลอร์ใน jvm? :-) javac ไม่ได้ทำการปรับปรุงใด ๆ
ปีเตอร์Štibraný

5
ใครจะรู้ :) javac เพิ่มประสิทธิภาพการแสดงออกประเภทนี้เมื่อใช้ตัวอักษรตัวเลขแม้ว่า (เช่น"" + 5กลายเป็น"5")
SimonJ

5
ใช่ แต่ทำไมคุณจะทำ"" + 5แทนที่จะเป็นแค่"5"?
Grungondola

3
ดี! +1 สำหรับสิ่งที่พวกเขาอาจไม่รู้
Sнаđошƒаӽ

2
"" + integerวิธีการที่ใช้ในการเป็นหนึ่งในบทเรียน oracle อย่างเป็นทางการ
Tomasz Nocoń

252

เป็นที่ยอมรับ แต่ฉันไม่เคยเขียนอะไรแบบนั้น ฉันต้องการสิ่งนี้:

String strI = Integer.toString(i);

101
ฉันชอบวิธีการ String.valueOf เนื่องจากคุณสามารถใช้การโทรชนิดเดียวกันทุกประเภทได้
Jon Skeet

1
NumberFormatter จะเป็นวิธีที่ดีกว่า
Kasturi

คำตอบที่ดี Kasturi ฉันโพสต์มันเป็นสิ่งที่มากกว่าความคิดเห็น
duffymo

2
ขอโทษด้วยที่ฉันไม่รู้ แต่สิ่งนี้จะไม่ใช้วัฒนธรรมปัจจุบันหรือไม่ ฉันมาจากพื้นหลัง. NET BTW
ΕГИІИО

3
สำหรับจำนวนเต็มไม่มีค่าเริ่มต้นสำหรับสิ่งที่ระบุเฉพาะวัฒนธรรม (ไม่มีตัวคั่นทศนิยมหรือหลักพันเลย) นั่นคือสิ่งที่NumberFormatterมีไว้เพื่อ NumberFormat.getInstance(Locale.FRENCH)คุณสามารถใช้รูปแบบเช่น
Kat

111

มันไม่ใช่วิธีที่ดี

เมื่อทำการแปลงจาก int ถึงสตริงควรใช้สิ่งนี้:

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

7
1. คุณขอสตริงว่าง 2. คุณขอการต่อข้อมูล; 3. เนื่องจากคุณไม่มีสตริงคุณจะแปลง int เป็นสตริง ทางออกของ daridoo หลีกเลี่ยงขั้นตอนแรก
Nicolas

จะint iได้รับการบรรจุลงในIntegerก่อนที่จะเพิ่มไปยังString strI?
เควินเมเรดิ ธ

1
@KevinMeredith ไม่ไม่ คุณจะโทรจริงStringBuilder.append(int)(และStringBuilderมีappendวิธีการสำหรับประเภทดั้งเดิมทั้งหมด)
Kat

60

มันไม่เพียง แต่เพิ่มประสิทธิภาพ1 ฉันไม่ชอบ

"" + i

เพราะมันไม่ได้แสดงสิ่งที่ผมอยากจะทำ2

ฉันไม่ต้องการที่จะผนวกจำนวนเต็มกับสตริง (ว่าง) ฉันต้องการแปลงจำนวนเต็มเป็นสตริง:

Integer.toString(i)

หรือไม่ใช่ตัวเลือกที่ฉันชอบ แต่ยังดีกว่าการต่อข้อมูลที่ได้รับการแทนค่าสตริงของวัตถุ (จำนวนเต็ม):

String.valueOf(i)

1. สำหรับรหัสที่เรียกว่าบ่อยมากเหมือนในลูป, การเพิ่มประสิทธิภาพให้แน่ใจว่าเป็นจุดที่ไม่ใช้ concatenation

2. สิ่งนี้ไม่ถูกต้องสำหรับการใช้งานการต่อข้อมูล จริงเช่นในSystem.out.println("Index: " + i); หรือ String id = "ID" + i;


3
คนที่พูดถึงการแสดงในบริบทนี้เป็นสิ่งที่ทำให้ไขว้เขว ไกล, ไกล, ไกล, ไกล, ไกล, สำคัญยิ่งกว่าคือการอ่านได้
Brian Goetz

23

หลักสูตรเบื้องต้นของมหาวิทยาลัยดูเหมือนจะสอนสไตล์นี้ด้วยเหตุผลสองประการ (จากประสบการณ์ของฉัน):

  • ไม่ต้องการความเข้าใจในคลาสหรือวิธีการ โดยปกติวิธีนี้จะสอนก่อนคำว่า "คลาส" จะถูกกล่าวถึง - หรือแม้แต่วิธีที่เรียก ดังนั้นการใช้สิ่งที่ต้องการString.valueOf(…)จะทำให้นักเรียนสับสน

  • มันเป็นภาพของ“ผู้ประกอบการบรรทุกเกินพิกัด” - ในความเป็นจริงนี้ถูกขายให้กับเราเป็นผู้ประกอบการมากเกินไปสำนวน (น่าแปลกใจเล็ก ๆ นี่ตั้งแต่ Java ไม่อนุญาตให้ผู้ประกอบการที่กำหนดเองมากไป)

ดังนั้นอาจเกิดจากความจำเป็นด้านการสอน (แม้ว่าฉันจะโต้แย้งว่านี่เป็นเพียงการสอนที่ไม่ดี) หรือใช้เพื่อแสดงให้เห็นถึงหลักการที่ยากที่จะแสดงให้เห็นใน Java


2
ฉันคิดว่าสิ่งที่ตรงกันข้ามเช่น "" + ฉันจะทำให้มือใหม่สับสน และมันก็เป็นสไตล์ที่ไม่ดีสำหรับชีวิตที่เหลือของพวกเขา
Konstantin Zyubin

15

การแสดงออก

"" + i

นำไปสู่การแปลงสตริงของiat at runtime Stringประเภทโดยรวมของการแสดงออกเป็น iถูกแปลงเป็นIntegerวัตถุ ( new Integer(i)) ก่อนแล้วจึงString.valueOf(Object obj)ถูกเรียก ดังนั้นจึงเท่ากับ

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

เห็นได้ชัดว่านี่เป็นนักแสดงน้อยกว่าเพียงแค่เรียกString.valueOf(new Integer(i))ซึ่งจะให้ผลลัพธ์เดียวกัน

ข้อดีของการ""+iพิมพ์นั้นง่ายกว่า / เร็วกว่าและบางคนอาจคิดว่าอ่านง่ายกว่า มันไม่ได้เป็นกลิ่นรหัสเพราะมันไม่ได้ระบุปัญหาที่ลึก

(อ้างอิง: JLS 15.8.1 )


3
คำสั่ง "เทียบเท่า" ของคุณไม่เท่ากัน แม้ว่าการเรียกString.valueOfมวยจำเป็นi(มันไม่ได้เป็นมีเกินที่ยอมรับเป็นนักint) ก็จะไม่ใช้ก็จะใช้new Integer(i) Integer.valueOf(i)แต่มันไม่ได้ทำสิ่งนี้ มันทำnew StringBuilder().append("").append(i).toString()ตามคำตอบของ SimonJ StringBuilder มีตรรกะของตัวเองสำหรับการเปลี่ยน int ดั้งเดิมiให้เป็น String
Mark Peters

4
ส่วนเกี่ยวกับกลิ่นรหัสถูกต้องว่า; รหัสกลิ่นเป็นคำที่ผิดที่นี่ ดังนั้นฉันจะถอดลงคะแนน
Mark Peters

ดูเหมือนว่าไม่มีประสิทธิภาพที่จะทำกับ "" + i แนะนำให้ใช้ Integer.toString หรือ String.valueOf แบบง่าย ๆ ดูjavadevnotes.com/java-integer-to-string-examples
JavaDev

14

โดยส่วนตัวฉันไม่เห็นอะไรเลวร้ายในรหัสนี้

มันมีประโยชน์มากเมื่อคุณต้องการบันทึกค่า int และตัวบันทึกเพิ่งยอมรับสตริง ฉันจะบอกว่าการแปลงดังกล่าวสะดวกเมื่อคุณต้องการเรียกใช้เมธอดที่รับสตริง แต่คุณมีค่า int

สำหรับการเลือกระหว่างInteger.toStringหรือString.valueOfมันเป็นเรื่องของรสนิยม
... และภายในการString.valueOfเรียกใช้Integer.toStringวิธีการโดยวิธี :)


12

วิธีอื่นที่ฉันทราบมาจากIntegerชั้นเรียน:

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

ตัวอย่างที่เป็นรูปธรรม (แม้ว่าฉันจะไม่คิดว่าคุณต้องการอะไร):

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

นอกจากนี้ยังทำงานชนิดดั้งเดิมอื่น ๆ Double.toStringเช่น

ดูที่นี่สำหรับรายละเอียดเพิ่มเติม


9

เทคนิคนี้ได้รับการสอนในชั้นเรียนการแนะนำสู่ระดับ Java ที่ฉันใช้เวลากว่าทศวรรษที่ผ่านมา อย่างไรก็ตามฉันควรทราบว่า IIRC เรายังไม่ได้รับวิธีการเรียน String และ Integer

เทคนิคง่ายและรวดเร็วในการพิมพ์ หากสิ่งที่ฉันกำลังทำคือการพิมพ์บางอย่างฉันจะใช้มัน (ตัวอย่างเช่นSystem.out.println("" + i);. อย่างไรก็ตามฉันคิดว่ามันไม่ใช่วิธีที่ดีที่สุดในการทำ Conversion เนื่องจากต้องใช้เวลาคิดสองวินาที วิธีนี้นอกจากนี้หากประสิทธิภาพเป็นสิ่งที่น่ากังวลดูเหมือนว่าจะช้ากว่า (มากกว่าด้านล่างและคำตอบอื่น ๆ )

โดยส่วนตัวแล้วฉันชอบ Integer.toString () เพราะเห็นได้ชัดว่าเกิดอะไรขึ้น String.valueOf () จะเป็นตัวเลือกที่สองของฉันเพราะมันดูสับสน (ดูความคิดเห็นหลังจากคำตอบของ darioo)

เพียงแค่ยิ้มกว้าง ๆ :) ฉันเขียนคลาสเพื่อทดสอบสามเทคนิค: "" + i, Integer.toString และ String.ValueOf การทดสอบแต่ละครั้งจะแปลง ints จาก 1 เป็น 10,000 เป็น Strings ฉันวิ่งไปตามคำสั่งเวลา Linux ห้าครั้ง Integer.toString () เร็วกว่า String.valueOf () หนึ่งครั้งพวกเขาจะเชื่อมโยงสามครั้งและ String.valueOf () จะเร็วขึ้นหนึ่งครั้ง อย่างไรก็ตามความแตกต่างไม่เคยเกินสองสามมิลลิวินาที

เทคนิค "" + i ช้ากว่าทั้งสองในทุกการทดสอบยกเว้นหนึ่งเมื่อมันเป็น 1 มิลลิวินาทีเร็วกว่า Integer.toString () และ 1 มิลลิวินาทีช้ากว่า String.valueOf () (ชัดในการทดสอบเดียวกันที่ String.valueOf () เร็วกว่า Integer.toString ()) ในขณะที่มันมักจะช้าลงเพียงสองสามมิลลิวินาที แต่มีการทดสอบหนึ่งครั้งซึ่งช้ากว่าประมาณ 50 มิลลิวินาที YMMV


1
อย่าลืมที่จะคำนึงถึง JIT เพราะการแปลงสองสามครั้งแรกนั้นจะช้ากว่ามากและบิดเบือนเวลา บน MacBook ของฉันการต่อข้อมูลจะใช้เวลานานกว่า ~ 20ns อีกสองวิธี (ซึ่งทั้งสองใช้เวลา ~ 50ns ต่อการแปลง) ดังนั้นความแตกต่างที่คุณเห็นตามลำดับของ ms อาจเกิดจากข้อผิดพลาดแบบสุ่ม (การกำหนดเวลา
SimonJ

6

มีหลายวิธีในการแปลงเป็นสตริง:

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

StringBuilder string = string.append (i) .toString (); ... หืมมดังนั้นมันคือ StringBuilder หรือสตริง? ความยุ่งเหยิงที่นี่ ...
Franta

6

ขึ้นอยู่กับว่าคุณต้องการใช้สตริงของคุณอย่างไร สิ่งนี้สามารถช่วย:

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

5

ส่วนใหญ่เหมือนกันใน SimonJ ฉันไม่ชอบ "" ฉัน + สำนวน ถ้าคุณพูด String.valueOf (i), Java จะแปลงจำนวนเต็มเป็นสตริงและส่งคืนผลลัพธ์ หากคุณพูดว่า "" + i, Java จะสร้างวัตถุ StringBuilder ต่อท้ายสตริงที่ว่างเปล่าเพื่อแปลงจำนวนเต็มให้เป็นสตริงผนวกสิ่งนี้กับ StringBuilder จากนั้นแปลง StringBuilder เป็นสตริง นั่นเป็นขั้นตอนพิเศษมากมาย ฉันคิดว่าถ้าคุณทำครั้งเดียวในโปรแกรมใหญ่มันไม่ใช่เรื่องใหญ่ แต่ถ้าคุณทำสิ่งนี้ตลอดเวลาคุณกำลังทำให้คอมพิวเตอร์ทำงานพิเศษและสร้างวัตถุพิเศษเหล่านี้ทั้งหมดซึ่งต้องทำให้สะอาดขึ้น ฉันไม่ต้องการคลั่งไคล้การเพิ่มประสิทธิภาพขนาดเล็ก แต่ฉันก็ไม่ต้องการที่จะสิ้นเปลืองอย่างไร้จุดหมายเช่นกัน



5

มีหลายวิธีในการแปลงจำนวนเต็มเป็นสตริง:

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) ... นี่ไม่ได้เป็น Int >> การแปลงแบบสตริงนี่เป็นแบบสตริง >> การประมวลผลสตริงที่นี่แม้จะมีการโหลดมากเกินไป ดังนั้นฉันไม่แนะนำ ไม่ใช่เพื่อจุดประสงค์ในการแปลงเท่านั้น
Franta


3

การใช้ "" + i เป็นวิธีที่สั้นและง่ายที่สุดในการแปลงตัวเลขเป็นสตริง มันไม่ได้มีประสิทธิภาพมากที่สุด แต่มันเป็น IMHO ที่ชัดเจนและมักจะสำคัญกว่า รหัสที่ง่ายกว่ามีโอกาสน้อยที่คุณจะทำผิดพลาด


2
หนึ่งจะทำผิดพลาดในการโทร String.valueOf หรือ Integer.toString ได้อย่างไร
Eva

1
ฉันได้พบกับการใช้งานที่ไม่เหมาะอย่างยิ่งของ String.valueOf () แต่ตอนนี้ฉันจำไม่ได้แล้ว ในขณะที่ผลลัพธ์ถูกต้องมันมีประสิทธิภาพน้อยกว่า""+i
Peter Lawrey

2

โดยส่วนตัวฉันคิดว่า "" + ฉันดูเป็นคำถามโปสเตอร์ต้นฉบับที่ระบุว่า "ส่งกลิ่น" ฉันใช้ภาษา OO จำนวนมากนอกเหนือจาก Java หากไวยากรณ์นั้นตั้งใจว่าเหมาะสมแล้ว Java ก็จะตีความ i เพียงอย่างเดียวโดยไม่ต้องการ "" ตามที่ต้องการเพื่อแปลงเป็นสตริงและทำเนื่องจากประเภทปลายทางนั้นไม่คลุมเครือและมีเพียงค่าเดียวเท่านั้นที่จะถูกส่งไปทางขวา . อีกดูเหมือนว่า 'หลอกลวง' เพื่อหลอกคอมไพเลอร์, โมโจที่ไม่ดีเมื่อมี Javac รุ่นต่าง ๆ ที่ผลิตโดยผู้ผลิตรายอื่นหรือจากแพลตฟอร์มอื่น ๆ ได้รับการพิจารณาว่ารหัสนั้นจำเป็นต้องได้รับการจัดพอร์ตหรือไม่ ใช้ Typecast: (String) i. วิงก์

ให้วิธีการเรียนรู้ของฉันและเพื่อความสะดวกในการเข้าใจโครงสร้างดังกล่าวเมื่ออ่านรหัสอื่น ๆ อย่างรวดเร็วฉันลงคะแนนให้กับวิธี Integer.toString (i) ลืม ns หรือ two ในวิธีที่ Java ใช้สิ่งต่าง ๆ ในพื้นหลังเทียบกับ String.valueOf (i) วิธีการนี้ให้ความรู้สึกที่ถูกต้องสำหรับฉันและบอกว่าเกิดอะไรขึ้น: ฉันมีและ Integer และฉันต้องการให้มันแปลงเป็นสตริง

จุดที่ดีที่ทำสองสามครั้งอาจเป็นเพียงการใช้ StringBuilder ล่วงหน้าเป็นคำตอบที่ดีในการสร้าง Strings ที่ผสมข้อความและ ints หรือวัตถุอื่น ๆ เพราะนั่นจะใช้อะไรในพื้นหลังใช่ไหม?

เพียงแค่สองเซ็นต์ของฉันโยนลงไปในกองทุนคิตตี้ที่จ่ายไปแล้วอย่างดีแล้วสำหรับคำตอบของคำถามม็อง ... ยิ้ม

แก้ไขคำตอบของฉันหลังจากการสะท้อนกลับบางส่วน:

ตกลงโอเคฉันคิดเรื่องนี้มากกว่านี้และ String.valueOf (i) ก็ดีเหมือนกันอย่างสมบูรณ์เหมือนที่มันบอกไว้: ฉันต้องการสตริงที่แทนค่าของจำนวนเต็ม แล้วภาษาอังกฤษก็ยากกว่าที่จะแยกวิเคราะห์แล้ว Java! แต่ฉันออกจากส่วนที่เหลือของคำตอบ / ความคิดเห็นของฉัน ... ฉันมักจะสอนให้ใช้ระดับต่ำสุดของวิธีการ / ฟังก์ชั่นโซ่ถ้าเป็นไปได้และยังคงรักษาความพร้อมดังนั้นถ้า String.valueOf เรียก Integer.toString แล้วทำไมใช้สีส้มทั้งหมด ถ้าคุณแค่ลอกมันยังไงล่ะอืม

เพื่อชี้แจงความคิดเห็นของฉันเกี่ยวกับ StringBuilder ฉันสร้างสตริงจำนวนมากด้วยคอมโบของข้อความและตัวอักษรส่วนใหญ่และพวกมันจบลงด้วยความยาวและน่าเกลียดด้วยการเรียกไปที่รูทีนที่กล่าวถึงข้างต้นซึ่งฝังอยู่ระหว่างเครื่องหมาย + SB วัตถุต่อไปและวิธีการผนวกมีมากเกินไปมันอาจจะสะอาดกว่านี้ไปข้างหน้าและใช้มัน ... ดังนั้นฉันเดาว่าฉันถึง 5 เซ็นต์ในตอนนี้ใช่มั้ย? ฮ่า ๆ...



-5

ลองพิมพ์ดีดอย่างง่าย

char c = (char) i;

3
นี่ไม่ใช่วิธีที่ดีในการแปลง int เป็นสตริง ที่จริงแล้วคุณไม่ได้แปลง int เป็นสตริงคุณกำลังแปลง int เป็นอักขระ สิ่งนี้จะตีความ int เป็นรหัสตัวอักษร ASCII และให้อักขระตัวนั้น มันอันตราย (ค่าลบ, ฯลฯ ) และโดยรวมก็ผิดธรรมดา
Nepoxx

โปรดล้างคำถามข้างต้นทั้งตัวอักษรและสตริงให้ต่างกัน ... !

แต่งานนี้ (ASCII charset "offset"):char c = (char) (i + 48);
electrobabe
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.