2011-08-04 35 views
5

如何在Java中使用下划线填充数字,而不是通常的零?如何在Java中使用下划线填充数字?

比如我想

  • 123.45进行格式化,以___ 123.45和
  • 12345.67被格式化,以_12345.67
  • 0.12被格式化,以_ __ _ __ .12

我尝试了很多东西,离我最近是这样的(通过使用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 
    } 

} 

嗯,不是真的接近,但空号,如果格式化的权利(与尾随下划线): _ __ _ __ __

总之,如何获得预期的行为建议?

+0

'DecimalFormatSymbols.setZeroDigit'用于设置字符以表示零**和其后的所有其他数字**。 ''跟着'_',这就是为什么你看到'___,___._''而不是'___,___._ 1'编辑:格式不起作用,但你得到了我认为的观点。 –

+0

是的,我知道setZeroDigit是如何工作的,但是我想要一个解决方法来达到预期的效果 – Belun

回答

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

其中numString牵着你的号码。要将double转换为String,您可以使用Double.toString(myDouble)

+1

不幸的是,'Double.toString(myDouble)'产生'123456.78'而不是'123,456.78' – OscarRyz

3

您可以使用Apache Commons库中的StringUtils.leftPad()方法。

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

那么0.01谁应该填充到______._ 1 ? – Belun

+1

@Belun你是对的,达到提问者要求的唯一方法是开发一个用户方法。 – Marcelo

1

大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("_,_","__") 
    ); 
    } 
    } 
} 

输出:

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

可能更换可以在一个步骤中完成,但我会告知你。

+2

这不适用于诸如'1230.45'或'1234.05'这样的数字 – Marcelo

+0

我不确定Marcelo,例如,OP对'0.01'预期'_____._ 1'而不是'______。01'。从原来的问题,我采取*“预期...”*并用断言测试它。看看这里:https://gist.github.com/1125723因此,根据OP的期望,这段代码可以完成所需的工作。 – OscarRyz

相关问题