使用最大字符数格式化数字

Posted

技术标签:

【中文标题】使用最大字符数格式化数字【英文标题】: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 抱歉,用户在读取值时可用的信息较少 【参考方案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 是的,我认为可以通过稍微修改方法来实现。我会检查我能做什么。

以上是关于使用最大字符数格式化数字的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode 405. 数字转换为十六进制数(补码的问题) / 166. 分数到小数(模拟长除法) / 482. 密钥格式化

405. 数字转换为十六进制数

405. 数字转换为十六进制数

leetcode 简单 第九十五题 数字转换为十六进制数

乙级PAT之数字分类(字符串类型的格式化)

位运算————数字转换为十六进制