【问题标题】:Format numbers with a maximum number of characters使用最大字符数格式化数字
【发布时间】:2015-12-06 19:36:40
【问题描述】:

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

String#substring(int, int) 不起作用,因为它不适用于科学记数法,或者会丢失信息 0.0000000000000001 会变成 0 而不是 1e-16

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

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

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

3 -> 3
0.0000000000000001 -> 1e-16
1234567891011121314 -> 1.234568e18
3.1415926535897932384626433832 -> 3.141592654
0.00010001000100010001 -> 0.00010001

我怎样才能做到这一点?

提前致谢!

【问题讨论】:

  • 为什么0.00010001 不能写成1.0001e-4?科学记数法你要几位数?
  • @Tunaki 请原谅我的歧义;我想用尽可能多的信息来表达数字。 1.0001e-4 的信息比 0.00010001 少。
  • 怎么样?是同一个号码,没有丢失信息
  • Here is an excellent post about this。我会发布一个受其启发的答案。
  • @Tunaki 抱歉,用户在读取值时可用的信息较少

标签: java number-formatting


【解决方案1】:

这可以帮助你,它的灵感来自我在 cmets 中链接的帖子。这将格式化字符串并删除前导零。

主要

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

【讨论】:

  • 看起来不错...但1,00000e-15 仍然有尾随零,3,14159e+00 应该是标准符号。我可以做一些正则表达式的东西,然后加回数字;有没有更好的方法?
  • @ricky3350 是的,我认为可以通过稍微修改方法来实现。我会检查我能做什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-18
  • 1970-01-01
  • 1970-01-01
  • 2011-08-27
  • 1970-01-01
  • 2010-09-07
相关资源
最近更新 更多