2011-05-04 58 views
106

Me estoy poniendo en un int con un valor de 6 dígitos. Quiero mostrarlo como String con un punto decimal (.) A 2 dígitos desde el final de int. Quería usar un float pero se sugirió usar String para una mejor salida de pantalla (en lugar de 1234.5 será 1234.50). Por lo tanto, necesito una función que tome un parámetro int como parámetro y devuelva el String formateado correctamente con un punto decimal de 2 dígitos desde el final.Insertar un carácter en una cadena en una posición determinada

Di:

int j= 123456 
Integer.toString(j); 

//processing... 

//output : 1234.56 

Respuesta

134
int j = 123456; 
String x = Integer.toString(j); 
x = x.substring(0, 4) + "." + x.substring(4, x.length()); 
+5

Las cadenas son inmutables. Si bien esto funciona, usar algo como StringBuilder es moralmente correcto, sin mencionar que hará que tu código sea más rápido. – wheresmycookie

+7

Olvídese de StringBuilder. Con un formato como este, [String.format] (http://docs.oracle.com/javase/7/docs/api/java/lang/String.html#format%28java.lang.String,%20java.lang .Object ...% 29) es la mejor opción disponible. – NobleUplift

+19

No hay bucle, es un caso de concatenación simple y el compilador debe optimizarlo utilizando un generador de cadenas, para facilitar la lectura prefiero usar el operador +, no es necesario en este caso usar StringBuilder explícitamente. El uso de la solución "StringBuilder" porque es más rápido no respeta las reglas de optimización. Código de legibilidad Optimice después del perfilado y solo donde sea necesario. http://en.wikipedia.org/wiki/Program_optimization#Quotes –

15
int your_integer = 123450; 
String s = String.format("%6.2f", your_integer/100.0); 
System.out.println(s); 
+0

Sugeriría usar 'java.math.BigDecimal' ya que usar' double' puede causar [error de redondeo] (http://stackoverflow.com/questions/177506/why-do-i-see-a-double-variable- initialized-to-some-value-like-21-4-as-21-3999996). Si la velocidad es más valiosa que la precisión, "doble" es mejor. – sotrh

3

usted podría utilizar

System.out.printf("%4.2f%n", ((float)12345)/100)); 

De acuerdo con los comentarios, 12345/100,0 sería mejor, al igual que el uso de doble en vez de flotación .

+1

'doble' podría ser una mejor opción. el flotador solo tiene una precisión de 6 dígitos. –

+1

Sí, otro ejemplo con el que alguien respondió fue usar 12345/100.0, que es más inteligente (aunque termina con el mismo resultado). –

+0

Toma de nitro: Creo que esto no dará el resultado correcto, porque 12345/100 = 123 in entero y solo se envía a 123.00 después. ((float) 12345/100) funcionaría. – rurouni

0

Si está utilizando un sistema en el flotador es caro (por ejemplo, sin FPU) o no permitido (por ejemplo, en la contabilidad) que podría utilizar algo como esto:

for (int i = 1; i < 100000; i *= 2) { 
     String s = "00" + i; 
     System.out.println(s.substring(Math.min(2, s.length() - 2), s.length() - 2) + "." + s.substring(s.length() - 2)); 
    } 

lo contrario, el DecimalFormat es la mejor solución. (La variante StringBuilder anterior no funcionará con los números pequeños (100) <

+2

En el caso de la contabilidad, sería mejor que BigDecimal. –

+0

@Joseph: tienes razón. No estoy en contabilidad y la mayoría de las veces uso ints como una representación de punto fijo por razones de rendimiento (en Java incrustado), por lo que BigDecimal no es mi elección ;-) – rurouni

163

Como se mencionó en los comentarios, un StringBuilder es probablemente una implementación más rápida y luego usando un StringBuffer Como se menciona en los documentos de Java:.

Esta clase proporciona una API compatible con StringBuffer, pero sin garantía de sincronización. Esta clase está diseñada para usarse como un reemplazo directo de StringBuffer en lugares donde el búfer de cadena estaba siendo utilizado por un único hilo (como suele ser el caso) Cuando sea posible, se recomienda que esta clase se use con preferencia a StringBuffer, ya que será más rápida en la mayoría de las implementaciones.

Uso:

String str = Integer.toString(j); 
str = new StringBuilder(str).insert(str.length()-2, ".").toString(); 

O si es necesario el uso de sincronización de la StringBuffer con uso similar:

String str = Integer.toString(j); 
str = new StringBuffer(str).insert(str.length()-2, ".").toString(); 
+2

Esta respuesta probablemente debería ser editada para usar 'StringBuilder' – Snekse

+0

@Snekse Muy bien punto. Has editado la respuesta sobre tu sugerencia. – blo0p3r

+4

Esto debe marcarse como la respuesta correcta. – calbertts

0
public static void main(String[] args) { 
    char ch='m'; 
    String str="Hello",k=String.valueOf(ch),b,c; 

    System.out.println(str); 

    int index=3; 
    b=str.substring(0,index-1); 
    c=str.substring(index-1,str.length()); 
    str=b+k+c; 
} 
0

En la mayoría de los casos de uso, utilizando un StringBuilder (como ya se ha contestado) es una buena manera de hacer esto. Sin embargo, si el rendimiento importa, esta puede ser una buena alternativa.

/** 
* Insert the 'insert' String at the index 'position' into the 'target' String. 
* 
* ```` 
* insertAt("AC", 0, "") -> "AC" 
* insertAt("AC", 1, "xxx") -> "AxxxC" 
* insertAt("AB", 2, "C") -> "ABC 
* ```` 
*/ 
public static String insertAt(final String target, final int position, final String insert) { 
    final int targetLen = target.length(); 
    if (position < 0 || position > targetLen) { 
     throw new IllegalArgumentException("position=" + position); 
    } 
    if (insert.isEmpty()) { 
     return target; 
    } 
    if (position == 0) { 
     return insert.concat(target); 
    } else if (position == targetLen) { 
     return target.concat(insert); 
    } 
    final int insertLen = insert.length(); 
    final char[] buffer = new char[targetLen + insertLen]; 
    target.getChars(0, position, buffer, 0); 
    insert.getChars(0, insertLen, buffer, position); 
    target.getChars(position, targetLen, buffer, position + insertLen); 
    return new String(buffer); 
} 
0

creo que una solución más simple y más elegante para insertar una cadena en una determinada posición sería la de una sola línea:

target.replaceAll("^(.{" + position + "})", "$1" + insert); 

Por ejemplo, para insertar la falta de un : en una cadena de tiempo:

"-0300".replaceAll("^(.{3})", "$1:"); 

lo que sí es, partidos position caracteres desde el principio de la cadena, grupos que, y reemplaza el grupo consigo mismo ($1) seguido de la cadena insert. Tenga en cuenta el replaceall, a pesar de que siempre hay una ocurrencia, porque el primer parámetro debe ser una expresión regular.

Por supuesto que no tiene el mismo rendimiento que la solución StringBuilder, pero creo que la concisión y elegancia como un simple y más fácil de leer (comparado con un método enorme) es suficiente para convertirla en la solución preferida en la mayoría de los casos de uso no críticos para el rendimiento.

Nota Estoy solucionando el problema genérico en el título por razones de documentación, por supuesto si está tratando con números decimales debe usar las soluciones específicas de dominio ya propuestas.

Cuestiones relacionadas