Java - 如何将数字格式化为2个字符的字符串?

2022-09-01 19:56:57

我如何格式化一个包含 2 个字符的字符串之间的 int。例如099

4  becomes "04"
36 becomes "36"

提前致谢。


答案 1

使用 String.format() 。例:

class Test{
    public static void main(String[]args){
        System.out.println(String.format("%02d", 42)); //42
        System.out.println(String.format("%02d",  7)); //07
    }
}

编辑:

luiscubal的评论引起了我的思考,所以我想为什么不对这三种选择进行基准测试。

import java.text.*;

interface Fmt{
    public String f(int x);
}

class Test{

    static NumberFormat formatter = new DecimalFormat("00");

    static Fmt f1 = new Fmt(){
        public String f(int x){ return ((x<10)?"0":"") + x; }
        public String toString(){return "f1";}
    };

    static Fmt f2 = new Fmt(){
        public String f(int x){ return String.format("%02d", x); }
        public String toString(){return "f2";}
    };

    static Fmt f3 = new Fmt(){
        public String f(int x){ return formatter.format(x); }
        public String toString(){return "f3";}
    };

    public static void main(String[]args){

        Fmt[] fmts = new Fmt[]{f1, f2, f3, f3, f2, f1};

        for (int x : new int[]{7, 42, 99}){

            String s0 = null;
            for (Fmt fmt : fmts)
                if (s0==null)
                    s0 = fmt.f(x);
                else
                    if (!fmt.f(x).equals(s0))
                        System.exit(1);

            System.out.printf("%02d\n", x);

            for (Fmt fmt : fmts){
                String s = null;
                int count = 0;
                System.gc();
                long t0 = System.nanoTime();
                for (int i=0; i<100000; i++){
                    count += fmt.f(x).length();
                }
                long t1 = System.nanoTime();

                System.out.printf("    %s:%8.2fms, count=%d\n",
                    fmt, (t1-t0)/1000000.0, count);
            }

        }
    }

}

我得到的输出是:

07
    f1:   11.28ms, count=200000
    f2:  195.97ms, count=200000
    f3:   45.41ms, count=200000
    f3:   39.67ms, count=200000
    f2:  164.46ms, count=200000
    f1:    6.58ms, count=200000
42
    f1:    5.25ms, count=200000
    f2:  163.87ms, count=200000
    f3:   42.78ms, count=200000
    f3:   42.45ms, count=200000
    f2:  163.87ms, count=200000
    f1:    5.15ms, count=200000
99
    f1:    5.83ms, count=200000
    f2:  168.59ms, count=200000
    f3:   42.86ms, count=200000
    f3:   42.96ms, count=200000
    f2:  165.48ms, count=200000
    f1:    5.22ms, count=200000

事实证明 - 如果我测试正确 - SpeedBirdNine有最有效的解决方案,尽管呈现得很糟糕。因此,我将我的解决方案修改为:

String answer = ((x<10)?"0":"") + x;

回想起来,我认为这是有道理的,因为我最初的解决方案产生了解析格式字符串的成本,并且我假设Anthony的格式化程序在每次迭代背后也有某种数据结构。

可以预见的是,通过保留包含所有100个字符串的a,速度要快得多,但这可能有点过分了......String[]


答案 2

您可以使用数字格式执行此操作。例如,

NumberFormat formatter = new DecimalFormat("00");
String s = formatter.format(4); 

推荐