Java 条件格式化输出

Java 条件格式化输出,java,formatter,Java,Formatter,我只能访问这样的函数,这意味着我无法更改此函数的输入或签名: public void log( String fmt , final Object... args ) { fmt = fmt.replace( "%f" , "%1.3e" ); System.out.print( String.format( Locale.US , fmt , args ); } 我想将fmt更改为仅包含%5.2f或%1.3e示例,具体取决于它所表示的实际十进制值,以实现每个十进制值的相同位数

我只能访问这样的函数,这意味着我无法更改此函数的输入或签名:

public void log( String fmt , final Object... args )
{
    fmt = fmt.replace( "%f" , "%1.3e" );
    System.out.print( String.format( Locale.US , fmt , args );
}
我想将fmt更改为仅包含%5.2f或%1.3e示例,具体取决于它所表示的实际十进制值,以实现每个十进制值的相同位数

假设6位数字+1点:

1234.56789 becomes 1234.56
123.456789 becomes 123.456
12.3456789 becomes 12.3456
...
0.00123456789  becomes 1.234e-3 
0.000123456789 becomes 1.234e-4
...

有人会怎么做呢?

相同数量的数字,我假设您指的是相同数量的字符,这是日志功能的常见要求

对于6位+1点,以下代码将为每个数字输出7个字符:

import java.util.Locale;

public class TestLog {
    public static void main(String[] args) {
        log("%f", 1234.56789);
        log("%f", 123.456789);
        log("%f", 1.3456789);
        log("%f", 0.0012345678);
        log("%f", 0.0001);

    }

    public static void log(String fmt, final Object... args) {
        for (int i = 0; i < args.length; i++) {
            if (args[i] instanceof Number) {
                double d = (Double) args[i];
                if (d < 0.01) 
                    // Too small for precision 2, switch to scientific notation
                    fmt = fmt.replace("%f", "%07.1e");
                else
                    fmt = fmt.replace("%f", "%07.2f");
            }
        }

        System.out.println(String.format(Locale.US, fmt, args));
    }
}

在任何情况下,占位符中的07部分都是最重要的,因为它保证了输出的最小宽度。前导的0标志确保输出用零填充,但如果需要空格,可以将其去掉。

我发现您的问题不清楚。您希望在什么情况下使用%5.2f与%1.3e。你能提供一些例子吗?这些参数的预期类型是什么?他们是双人的吗?混合的。字符串、双精度、整数等。
1234.57
0123.46
0001.35
1.2e-03
1.0e-04