使用最大字符数格式化数字
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. 密钥格式化