格式化具有最大字符数的数字

时间:2015-12-06 19:36:40

标签: java number-formatting

我在JTable中输入数字。如果我输入一个太长的数字,它将用省略号截断。我想覆盖这种行为,以便格式化数字,使它们适合单元格。这将涉及将某些数字纳入科学记数法。我也不想要领先或尾随的零;如果数字不是单元格的整个宽度,则可以接受。

String#substring(int, int)不起作用,因为这不适用于科学记数法,或者会丢失信息// print all numbers with n digits public static void printBinaryNumber(int n){ // print all numbers with n digits recursively adding "" printBinaryNumbersRec("", n); } public static void printBinaryNumbersRec(String s, int n){ if(n < 0) throw new IllegalArgumentException(); if(n == 0) { // if I should print all numbers with 0 digits and add s before them // I just print s and am done System.out.println(s); return; } // add an additional 0 to s and print all numbers with n-1 digits printBinaryNumbersRec(s + "0", n-1); // add an additional 1 to s and print all numbers with n-1 digits printBinaryNumbersRec(s + "1", n-1); } 将变为0.0000000000000001而不会0

具有1e-16格式的

String#format(String, Object...)不起作用,因为它会留下尾随/前导零,并且不包括数字计数中的科学记数法。

我也看了DecimalFormat,但找不到任何允许设置字符数的内容。

预期行为的一些示例(最大字符数为11):

%g

我怎么能做到这一点?

提前致谢!

1 个答案:

答案 0 :(得分:1)

这可以帮到你,它的灵感来自我在评论中链接的帖子。这将格式化String并删除前导零。

主要

String[] nums = {"000000003","0.000000000000001","1234567891011121314","3.1415926535897932384626433832","0.00010001000100010001"};
for (int i = 0 ; i < nums.length ; i++){
    System.out.println(format(nums[i].replaceAll("^0*", "")));
}

格式方法

public static String format(String s){
    if (s.length() <= 11) return s;
    return String.format("%6.5e", Double.valueOf(s));
}

输出

3
1,00000e-15
1,23457e+18
3,14159e+00
1,00010e-04