如何在Java中使用下划线填充数字?

5
如何在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
    }

}

虽然并不完全相同,但如果格式正确(带有尾随下划线),则是一个空数字: ___,___.__

无论如何,有关如何获得预期行为的建议?


DecimalFormatSymbols.setZeroDigit 用于设置表示零和其后所有数字的字符。 _ 后面跟着 ,___,___._,这就是为什么你看到的是 ___,___._ 而不是 ___,___._1。编辑:格式可能无法正常显示,但我想你明白我的意思。 - Vineet Reynolds
是的,我知道setZeroDigit的工作原理,但我正在寻求一种解决方法来实现预期的结果。 - Belun
3个回答

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

其中num是一个包含你的数字的String。要将一个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

2

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

输出:

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

也许可以一步完成替换,但我会把这个决定留给你。

我不确定Marcelo,例如OP期望_____._1表示0.01而不是______.01。从原始问题中,我提取了“期望...”并使用断言进行测试。请看这里:https://gist.github.com/1125723 因此,根据OP的期望,此代码实现了所需功能。 - OscarRyz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接