¿Cómo convierto de int a String?

745

Estoy trabajando en un proyecto donde todas las conversiones de inta Stringse hacen así:

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

No estoy familiarizado con Java.

¿Es esta práctica habitual o hay algo mal, como supongo?

Denis Palnitsky
fuente
47
La forma "tonta y fácil" es string = "" + integer;
Fattie
1
buen documento: [ javarevisited.blogspot.de/2011/08/… ejemplo
Narayan Yerrabachu
2
Simplemente quise decir que es una forma "rápida y simple" de hacerlo. es un poco tonto pero funciona!
Fattie
1
Un colega mío lo hizo Integer.valueOf(i).toString(). Debe haber sido aficionado a los objetos. Si bien establece claramente su intención, es un poco largo para mi gusto.
Ole VV
55
Solo necesita 45 líneas de código e implementar 7 interfaces para hacerlo.
Ska

Respuestas:

958

Las formas normales serían Integer.toString(i)o String.valueOf(i).

La concatenación funcionará, pero no es convencional y podría ser un mal olor, ya que sugiere que el autor no conoce los dos métodos anteriores (¿qué más podrían no saber?).

Java tiene soporte especial para el operador + cuando se usa con cadenas (consulte la documentación ) que traduce el código publicado en:

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

en tiempo de compilación. Es un poco menos eficiente ( sb.append()termina llamando Integer.getChars(), que es lo que Integer.toString()habría hecho de todos modos), pero funciona.

Para responder el comentario de Grodriguez: ** No, el compilador no optimiza la cadena vacía en este caso - mira:

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

Inicialice el StringBuilder:

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

Agregue la cadena vacía:

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

Añadir el número entero:

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

Extraer la cadena final:

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

Hay una propuesta y un trabajo en curso para cambiar este comportamiento, dirigido a JDK 9.

SimonJ
fuente
99
¿Qué pasa con el compilador jit en jvm? :-) javac no hace ninguna optimización elegante.
Peter Štibraný
55
Quién sabe :) javac optimiza este tipo de expresiones cuando se utilizan literales numéricos (por ejemplo, se "" + 5convierte en "5").
SimonJ
55
Sí, pero ¿por qué lo harías en "" + 5lugar de solo "5"?
Grungondola
3
¡Agradable! ¿+1 para qué más podrían no saber?
Sнаđошƒаӽ
2
El "" + integerenfoque se utiliza en uno de los tutoriales oficiales de Oracle .
Tomasz Nocoń
252

Es aceptable, pero nunca he escrito algo así. Prefiero esto:

String strI = Integer.toString(i);
duffymo
fuente
101
Prefiero el enfoque String.valueOf, ya que puede usar exactamente la misma llamada para cualquier tipo.
Jon Skeet el
1
NumberFormatter sería un mejor enfoque
Kasturi
Una buena respuesta, Kasturi. Lo publicaría como algo más que un comentario.
duffymo
2
Perdón por mi ignorancia, pero ¿no usaría esto la cultura actual? Voy a formar un fondo .NET, por cierto.
Ε Г И І И О
3
Para un número entero, no se utilizan elementos específicos de la cultura por defecto (no hay separador decimal o de miles). Para eso NumberFormatteres eso . Puedes usar formatos como NumberFormat.getInstance(Locale.FRENCH).
Kat
111

No es un buen camino.

Al hacer la conversión de int a string, esto debe usarse:

int i = 5;
String strI = String.valueOf(i);
darioo
fuente
77
1. Pides la cadena vacía; 2. Pides concatenación; 3. como no tiene una cadena, finalmente convertirá su int en una cadena. La solución de daridoo evita los primeros pasos.
Nicolas
¿ int ise encajona a un Integerantes de ser agregado al String strI?
Kevin Meredith
1
@KevinMeredith, no, no lo hace. Realmente estaría llamando StringBuilder.append(int)(y StringBuildertiene un appendmétodo para todos los tipos primitivos).
Kat
60

No es solo la optimización 1 . No me gusta

"" + i

porque no expresa lo que realmente quiero hacer 2 .

No quiero agregar un número entero a una cadena (vacía). Quiero convertir un entero en una cadena:

Integer.toString(i)

O, no es lo que prefiero, pero aún mejor que la concatenación, obtenga una representación de cadena de un objeto (entero):

String.valueOf(i)

1. Para el código que se llama con mucha frecuencia, como en los bucles, la optimización segura también es un punto para no usar la concatenación .

2. esto no es válido para el uso de concatenación real como en System.out.println("Index: " + i); o String id = "ID" + i;

usuario85421
fuente
3
Las personas que hablan sobre el desempeño en este contexto son una distracción. Lejos, lejos, lejos, lejos, lejos, mucho más importante es la legibilidad .
Brian Goetz
23

Muchos cursos universitarios introductorios parecen enseñar este estilo, por dos razones (en mi experiencia):

  • No requiere comprensión de clases o métodos. Por lo general, esto se enseña mucho antes de que se mencione la palabra "clase", ni siquiera las llamadas a métodos. Así que usar algo así String.valueOf(…)confundiría a los estudiantes.

  • Es una ilustración de "sobrecarga del operador"; de hecho, esto se nos vendió como el operador idiomático sobrecargado (una pequeña maravilla aquí, ya que Java no permite la sobrecarga del operador personalizado).

Por lo tanto, puede nacer de una necesidad didáctica (aunque yo diría que esto es solo una mala enseñanza) o puede usarse para ilustrar un principio que de otra manera es bastante difícil de demostrar en Java.

Konrad Rudolph
fuente
2
Creo que, por el contrario, construcciones como "" + confundiría a los novatos. Y también es un mal estilo para el resto de sus vidas.
Konstantin Zyubin
15

La expresion

"" + i

conduce a la conversión de cadenasi en tiempo de ejecución. El tipo general de la expresión es String. iprimero se convierte en un Integerobjeto ( new Integer(i)), luego String.valueOf(Object obj)se llama. Entonces es equivalente a

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

Obviamente, esto es un poco menos eficaz que simplemente llamar, String.valueOf(new Integer(i))lo que producirá el mismo resultado.

La ventaja de esto ""+ies que escribir es más fácil / más rápido y algunas personas podrían pensar que es más fácil de leer. No es un olor a código, ya que no indica ningún problema más profundo.

(Referencia: JLS 15.8.1 )

Andreas Dolk
fuente
3
Su declaración "equivalente" no es equivalente. Incluso si llamar String.valueOfrequiere boxeo i(no lo hace, ya que hay una sobrecarga que acepta un int), no lo usaría new Integer(i), lo haría Integer.valueOf(i). Pero realmente no hace nada de esto. Lo hace new StringBuilder().append("").append(i).toString(), como señala la respuesta de SimonJ. StringBuilder tiene su propia lógica para convertir un int primitivo ien un String.
Mark Peters el
44
Sin embargo, la parte sobre el olor del código es correcta; código olor es el término incorrecto aquí. Así que me quitaré el voto negativo.
Mark Peters el
Parece ineficiente hacerlo con "" + i. Simplemente se recomienda Integer.toString o String.valueOf. Ver javadevnotes.com/java-integer-to-string-examples
JavaDev
14

Personalmente, no veo nada malo en este código.

Es bastante útil cuando desea registrar un valor int, y el registrador solo acepta una cadena. Diría que tal conversión es conveniente cuando necesita llamar a un método que acepta una Cadena, pero tiene un valor int.

En cuanto a la elección entre Integer.toStringo String.valueOf, todo es cuestión de gustos.
... E internamente, por cierto , String.valueOfllama al Integer.toStringmétodo. :)

ksu
fuente
12

La otra forma que conozco es de la Integerclase:

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

Un ejemplo concreto (aunque no creo que necesite ninguno):

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

También funciona para otros tipos primitivos, por ejemplo Double.toString .

Ver aquí para más detalles.

zneak
fuente
9

Esta técnica se enseñó en una clase de introducción a Java de nivel universitario que tomé hace más de una década. Sin embargo, debo señalar que, IIRC, todavía no habíamos llegado a los métodos de clase String e Integer.

La técnica es simple y rápida de escribir. Si todo lo que estoy haciendo es imprimir algo, lo usaré (por ejemplo,System.out.println("" + i); ,. Sin embargo, creo que no es la mejor manera de hacer una conversión, ya que me toma un segundo pensar en lo que sucede cuando se está usando de esta manera, además, si el rendimiento es una preocupación, parece más lento (más abajo, así como en otras respuestas).

Personalmente, prefiero Integer.toString (), ya que es obvio lo que está sucediendo. String.valueOf () sería mi segunda opción, ya que parece ser confuso (sea testigo de los comentarios después de la respuesta de darioo).

Solo por sonrisas :) Escribí clases para probar las tres técnicas: "" + i, Integer.toString y String.ValueOf. Cada prueba acaba de convertir las entradas de 1 a 10000 en cadenas. Luego ejecuté cada uno a través del comando de tiempo de Linux cinco veces. Integer.toString () fue ligeramente más rápido que String.valueOf () una vez, empataron tres veces, y String.valueOf () fue más rápido una vez; sin embargo, la diferencia nunca fue más que un par de milisegundos.

La técnica "" + i fue más lenta que ambas en cada prueba, excepto en una, cuando fue 1 milisegundo más rápido que Integer.toString () y 1 milisegundo más lento que String.valueOf () (obviamente en la misma prueba donde String.valueOf () fue más rápido que Integer.toString ()). Si bien generalmente solo era un par de milisegundos más lento, hubo una prueba en la que fue aproximadamente 50 milisegundos más lento. YMMV .

GreenMatt
fuente
1
No olvides tener en cuenta el JIT: las primeras conversiones serán mucho más lentas y distorsionarán los tiempos. En mi MacBook, la concatenación tarda ~ 20ns más que los otros dos métodos (que ambos requieren ~ 50ns por conversión), por lo que las diferencias que vio en el orden de ms probablemente se deban a un error aleatorio (programación, interrupciones, etc.).
SimonJ
6

Hay varias formas de convertir a cadenas:

StringBuilder string = string.append(i).toString();
String string = String.valueOf(i);
String string = Integer.toString(i);
Shailej Shimpi
fuente
StringBuilder string = string.append (i) .toString (); ... Hm, entonces, ¿es el StringBuilder o un String? Un desastre aquí ...
Franta
6

Depende de cómo quieras usar tu String. Esto puede ayudar:

String total =  Integer.toString(123) + Double.toString(456.789);
Niyuhire Justine
fuente
5

Principalmente lo mismo en SimonJ. Realmente no me gusta el idioma "" + i. Si dice String.valueOf (i), Java convierte el entero en una cadena y devuelve el resultado. Si dice "" + i, Java crea un objeto StringBuilder, le agrega una cadena vacía, convierte el entero en una cadena, lo agrega al StringBuilder, luego convierte el StringBuilder en una cadena. Eso son muchos pasos adicionales. Supongo que si lo haces una vez en un gran programa, no es gran cosa. Pero si está haciendo esto todo el tiempo, está haciendo que la computadora haga un montón de trabajo extra y creando todos estos objetos adicionales que luego deben limpiarse. No quiero volverme fanático de la microoptimización, pero tampoco quiero ser un derroche inútil.

Arrendajo
fuente
5
String strI = String.valueOf(i);

String string = Integer.toString(i);

Ambas formas son correctas.

Shailej Shimpi
fuente
5

Hay muchas formas de convertir un entero en una cadena:

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)
Hoque MD Zahidul
fuente
1
String.format ("% d", 1000000) ... Esto no es realmente Int >> Conversión de cadenas, es más bien String >> Procesamiento de cadenas aquí, a pesar de estar sobrecargado. Entonces no recomiendo esto. Definitivamente no para propósitos de solo una conversión.
Franta
5

Hay tres formas de convertir a cadenas

  1. String string = "" + i;
  2. String string = String.valueOf(i);
  3. String string = Integer.toString(i);
Vihaan Verma
fuente
1
Se le olvidó: String.format("%d", i).
Brian Goetz
3

Usar "" + i es la forma más corta y sencilla de convertir un número en una cadena. No es el más eficiente, pero es el más claro en mi humilde opinión y eso suele ser más importante. Cuanto más simple sea el código, es menos probable que cometa un error.

Peter Lawrey
fuente
2
¿Cómo cometer un error al llamar a String.valueOf o Integer.toString?
Eva
1
Me he encontrado con un par de usos no ideales de String.valueOf () pero no puedo recordarlos ahora. Si bien la salida fue correcta, fue menos eficiente que""+i
Peter Lawrey
2

Personalmente, creo que "" + i parece que el cartel original de la pregunta dice "maloliente". He usado muchos lenguajes OO además de Java. Si se pretendía que esa sintaxis fuera apropiada, entonces Java interpretaría solo el i sin necesidad de que "" se desea convertir a una cadena y lo haría ya que el tipo de destino no es ambiguo y solo se proporcionaría un único valor a la derecha . El otro parece un "truco" para engañar al compilador, un mal humor cuando se consideran diferentes versiones de Javac hechas por otros fabricantes o desde otras plataformas si el código alguna vez necesita ser portado. Diablos por mi dinero, debería gustarle a muchos otros OOL tomar un Typecast: (String) i. guiños

Dada mi forma de aprender y para facilitar la comprensión de tal construcción al leer el código de otros rápidamente, voto por el método Integer.toString (i). Olvidando una o dos cosas sobre cómo Java implementa las cosas en segundo plano frente a String.valueOf (i) este método me parece correcto y dice exactamente lo que está sucediendo: tengo e Integer y deseo que se convierta en String.

Un buen punto de vista un par de veces es que quizás solo usar StringBuilder por adelantado es una buena respuesta para construir cadenas mixtas de texto e ints u otros objetos, ya que eso es lo que se usará en el fondo de todos modos, ¿verdad?

Solo mis dos centavos arrojados al gatito ya bien pagado de las respuestas a la pregunta de Mans ... sonrisas

EDITAR A MI PROPIA RESPUESTA DESPUÉS DE ALGUNA REFLEXIÓN:

Ok, Ok, estaba pensando en esto un poco más y String.valueOf (i) también es perfectamente bueno y dice: Quiero una cadena que represente el valor de un número entero. jajaja, el inglés es mucho más difícil de analizar que Java! Pero, dejo el resto de mi respuesta / comentario ... Siempre me enseñaron a usar el nivel más bajo de una cadena de método / función si es posible y todavía mantiene la legibilidad, de modo que si String.valueOf llama a Integer.toString, entonces ¿Por qué usar una naranja entera? si de todos modos lo pelarás, ¿mmm?

Para aclarar mi comentario sobre StringBuilder, construyo muchas cadenas con combos de texto en su mayoría literales e int y terminan siendo largos y feos con llamadas a las rutinas mencionadas anteriormente incrustadas entre los + 's, así que me parece si esos se vuelven De todos modos, SB se opone y el método append tiene sobrecargas, podría ser más limpio seguir adelante y usarlo ... Entonces, supongo que ahora tengo hasta 5 centavos en este, ¿eh? jajaja ...

David
fuente
-1

utilizar Integer.toString(tmpInt).trim();

Karan Chunara
fuente
Realmente no hay ninguna situación en la trim()que sería útil aquí.
Dorian Gray
-5

Prueba la conversión simple

char c = (char) i;
Bilal Haider
fuente
3
Esta no es una buena manera de convertir un int en una cadena. En realidad, no estás convirtiendo un int en una cadena, estás convirtiendo un int en un char. Esto interpretará el int como un código de caracteres ASCII y le dará ese carácter. Es peligroso (valores negativos, etc.) y, en general, simplemente está mal.
Nepoxx
Por favor, aclare la pregunta anterior, ¡char y String son diferentes ...!
pero esto funciona (juego de caracteres ASCII "offset"):char c = (char) (i + 48);
electrobabe