Java如何给数字加前导零

18

我需要以 xxx-xxxx 的形式返回一个字符串,其中 xxx 是一个数字,xxxx 是另外一个数字,但是当我有前导零时,它们会消失。我尝试使用数字格式化程序,但它不起作用。

 public String toString(){
        NumberFormat nf3 = new DecimalFormat("#000");
        NumberFormat nf4 = new DecimalFormat("#0000");
        if( areaCode != 0)
            return nf3.format(areaCode) + "-" + nf3.format(exchangeCode) + "-" + nf4.format(number);
        else
            return exchangeCode + "-" + number;
    }

我明白了:

 public String toString(){
        NumberFormat nf3 = new DecimalFormat("000");
        NumberFormat nf4 = new DecimalFormat("0000");
        if( areaCode != 0)
            //myFormat.format(new Integer(someValue));
            return nf3.format(new Integer(areaCode)) + "-" + nf3.format(new Integer(exchangeCode)) + "-" + nf4.format(new Integer(number));
        else
            return nf3.format(new Integer(exchangeCode)) + "-" + nf4.format(new Integer(number));
    }

哈哈,所以我的答案去掉#号不正确吗? :P - Holograham
去掉 # 号对我有用。 我需要一个前导 0,所以我只是使用了 ("00"),然后它就可以工作了。 - Opy
5个回答

26

有一种更加优雅的解决方案:

String.format("%03d-%03d-%04d", areaCode, exchangeCode, number)

+1 更加优雅简洁。不会想到其他的解决方案。 - Yuval Adam
糟糕。我作为一个开发者已经有20年了,居然不知道这个。[这家伙感觉好蠢啊……] 谢谢分享。 - Lawrence

18
areaCode 为 0 时,你忘记调用 format!除此之外,代码看起来没问题。前导的 "#" 不是必需的,但对于有效输入也不会造成问题。
我刚试了一下,结果很好。
public static String formatTest(int areaCode, int exchangeCode, int number) {
    DecimalFormat nf3 = new DecimalFormat("#000");
    DecimalFormat nf4 = new DecimalFormat("#0000");
    if( areaCode != 0)
        return nf3.format(areaCode) + "-" + nf3.format(exchangeCode) + "-" + nf4.format(number);
    else
        return nf3.format(exchangeCode) + "-" + nf4.format(number);
}


public static void main(String[] args) {
    System.out.println(formatTest(12, 90, 8));
    System.out.println(formatTest(1, 953, 1932));
}

输出:

012-090-0008
001-953-1932

1
不是针对你,但是String.format是处理这个问题最简单的方法。 - ring bearer
1
没问题。String格式确实更优雅,但是发帖者已经有了使用DecimalFormat的解决方案,并只是想知道为什么它不起作用。 - Justin Ardini

6

去掉#号

http://java.sun.com/docs/books/tutorial/i18n/format/decimalFormat.html

这段代码:

import java.text.DecimalFormat;
import java.text.NumberFormat;


public class Test
{

    public static void main(String[] args) 
    {       
        int areaCode = 123;
        int exchangeCode = 456;

        NumberFormat nf3 = new DecimalFormat("0000");

        System.out.println(nf3.format(areaCode) + "-" + nf3.format(exchangeCode) );
    }

}

产生以下输出:

0123-0456


这不是他要找的。格式不应该是两个四位数字。它是电话号码格式,###-####。 - Justin Ardini
我的意思不是要复制他的问题,而是展示如何添加前导零...这种方法可行。 - Holograham

4
我建议使用NumberFormat (http://docs.oracle.com/javase/7/docs/api/java/text/NumberFormat.html),我认为它提供了最好的可读性。同时当您将错误的字符串放入DecimalFormat时,也可以最大限度地减少错误的可能性。
  final int value1 = 1; 
  final double value2 = 4.2;

  NumberFormat nf = NumberFormat.getInstance(Locale.US);
  nf.setMinimumIntegerDigits(2);

  System.out.println(nf.format(value1));
  System.out.println(nf.format(value2));

输出:

  01
  04.2

(当你与国际团队合作时,Locale是可选的,但我建议使用它。默认值是本地设置)

无论如何,以这种方式编写的NumberFormat非常棒,尤其是在处理不同国家或百分比、货币之类的事物时。


0

你可以使用NumberFormat类,并将最小零设置为0,它非常容易使用,例如货币格式:

   formatter = NumberFormat.getCurrencyInstance();
   formatter.setMinimumFractionDigits(0);
   -----------
   print ( formatter.format(119.00) ) ---> $119

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