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

Posted

技术标签:

【中文标题】如何在 Java 中用下划线填充数字?【英文标题】:How to pad numbers with underscore in Java? 【发布时间】:2011-08-04 17:02:22 【问题描述】:

如何在 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 用于将字符设置为表示零及其后面的所有其他数字。 ` 跟随_ 这就是为什么你看到___,___._`` instead of ___,___._1` 编辑:格式不起作用,但我想你明白了。 是的,我知道 setZeroDigit 是如何工作的,但我要求一种解决方法来实现预期 【参考方案1】:
"_________".substring( num.length() )+num;

其中num 是一个String 持有您的号码。要将double 转换为String,您可以使用Double.toString(myDouble)

【讨论】:

不幸的是Double.toString( myDouble ) 产生123456.78 而不是123,456.78【参考方案2】:

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

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

【讨论】:

0.01 谁应该被填充到 _._1 呢? @Belun 你说得对,实现提问者要求的唯一方法就是开发一个用户方法。【参考方案3】:

哒哒哒

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 。从最初的问题中,我采用了 "expected ..." 并用断言对其进行了测试。看这里:gist.github.com/1125723 所以,根据 OP 的期望,这段代码可以满足需要。

以上是关于如何在 Java 中用下划线填充数字?的主要内容,如果未能解决你的问题,请参考以下文章

在Java中用零填充

如何在 JavaScript 中用“下划线”(“_”)替换 80% 的字符串?

在JavaScript中用前导零填充数字[重复]

Python:如何在所有文件、文件夹和子文件夹的名称中用下划线替换空格?

如何在iOS中用渐变填充CGPoints定义的形状?

如何在 Swift 3 中用 JSON 数据填充表格?