2011-08-04 10 views
5

Cómo rellenar números con guiones bajos en Java, en lugar de los ceros habituales?Cómo rellenar números con guiones bajos en Java?

Por ejemplo quiero

  • 123,45 para ser formateados a ___ 123.45 y
  • 12.345,67 para ser formateados a _12345.67
  • 0.12 para ser formateados a _ __ _ __ .12

Probé muchas cosas y lo más cerca que conseguí Fue este (mediante el uso de SYMBOLS.setZeroDigit ('_');):

import java.text.DecimalFormat; 
import java.text.DecimalFormatSymbols; 

public class Example { 

    public static void main(String[] args) { 
     DecimalFormatSymbols SYMBOLS = new DecimalFormatSymbols(); 
     SYMBOLS.setDecimalSeparator('.'); 
     SYMBOLS.setGroupingSeparator(','); 
     DecimalFormat OUTPUT_FORMAT = new DecimalFormat("000,000.00", SYMBOLS); 

     System.out.println(OUTPUT_FORMAT.format(0.01)); 
     // got 000,000.01 
     System.out.println(OUTPUT_FORMAT.format(0.12)); 
     // got 000,000.12 
     System.out.println(OUTPUT_FORMAT.format(123456)); 
     // got 123,456.00 
     System.out.println(OUTPUT_FORMAT.format(123456.78)); 
     // got 123,456.78 
     System.out.println(OUTPUT_FORMAT.format(1234)); 
     // got 001,234.00 
     System.out.println(OUTPUT_FORMAT.format(1234.56)); 
     // got 001,234.56 

     SYMBOLS.setZeroDigit('_'); 
     OUTPUT_FORMAT = new DecimalFormat("000,000.00", SYMBOLS); 
     System.out.println(OUTPUT_FORMAT.format(0.01)); 
     // expected ______._1 but got ___,___._` 
     System.out.println(OUTPUT_FORMAT.format(0.12)); 
     // expected ______.12 but got ___,___.`a 
     System.out.println(OUTPUT_FORMAT.format(123456)); 
     // expected 123,456.__ but got `ab,cde.__ 
     System.out.println(OUTPUT_FORMAT.format(123456.78)); 
     // expected 123,456.78 but got `ab,cde.fg 
     System.out.println(OUTPUT_FORMAT.format(1234)); 
     // expected __1,234.00 or at least __1,234.__ but got __`,abc.__ 
     System.out.println(OUTPUT_FORMAT.format(1234.56)); 
     // expected __1,234.56 but got __`,abc.de 
    } 

} 

Bueno, no realmente cerca, pero un número vacía si la derecha con formato (con guiones al final): _ __ ,_ __. __

De todos modos, sugerencias sobre cómo conseguir el comportamiento esperado?

+0

'DecimalFormatSymbols.setZeroDigit' se utiliza para configurar el carácter para representar cero ** y todos los demás dígitos que le siguen **. 'sigue a' _' y es por eso que estás viendo '___, ___._' 'en lugar de' ___, ___._ 1' Editar: el formateo no funciona pero entiendes el punto, supongo. –

+0

sí, sé cómo funciona setZeroDigit pero estaba pidiendo una solución para lograr el esperado – Belun

Respuesta

6
"_________".substring(num.length())+num; 

donde num es una String la celebración de su número. Para convertir un double en un String, puede usar Double.toString(myDouble).

+1

Desafortunadamente 'Double.toString (myDouble)' produce '123456.78' en lugar de' 123,456.78' – OscarRyz

3

Puede usar el método StringUtils.leftPad() de la biblioteca de Apache Commons.

// pad to 10 chars 
String padded = StringUtils.leftPad("123.456", 10, '_'); 
// padded will be equal to "___123.456" 
+1

¿qué pasa con 0.01 que debe rellenarse a ______._ 1 ? – Belun

+1

@Belun Tienes razón, la única manera de lograr el requisito de los solicitantes es desarrollar un método de usuario. – Marcelo

1

Da daaa

import java.text.DecimalFormat; 

class F { 
    public static void main(String ... args) { 
    DecimalFormat f = new DecimalFormat("000,000.00"); 
    for(double d : new double[]{ 0.01, 0.12, 123456, 123456.78, 1234, 1234.56 }){ 
     System.out.println( 
     f.format(d).replaceAll("0","_").replaceAll("_,_","__") 
    ); 
    } 
    } 
} 

Salida:

______._1 
______.12 
123,456.__ 
123,456.78 
__1,234.__ 
__1,234.56 

Probablemente la sustitución se podría hacer en un solo paso, pero dejaré que eso.

+2

Esto no funcionará con números como '1230.45' o' 1234.05' – Marcelo

+0

No estoy seguro de que Marcelo, el OP, por ejemplo, espere '_____._ 1' para' 0.01' y no '______. 01'. De la pregunta original tomé el * "esperado ..." * y lo compruebo con aserciones. Mira aquí: https://gist.github.com/1125723 Entonces, según las expectativas de OP este código hace lo que se necesita. – OscarRyz

Cuestiones relacionadas