我有一个数字作为字符串,如下所示:“9.756088256835938E-4”,但我只能使用指定数量的字符(在这种特殊情况下为 9 个字符)。所以我想要这样的东西:“9.7561E-4”。我已经尝试将字符串转换为 double ,然后使用格式方法来获得更少的字符,但我没有得到正确的解决方案。
问题是我需要十个指数输出,因为有些数字比我拥有的字符数长。如果可能的话,数字应该不显示十指数,如果不能就使用十指数。
正确的舍入也很好。
它应该适用于负数。 (减去需要一个字符!!!)
是否有一个格式函数可以定义输出字符串的最大长度?有什么想法吗?
最佳答案
我无法找到一个可以涵盖您描述的所有情况的单一格式模式。但我认为以下是有效的逻辑组合:
public static void main(String[] args) throws Exception {
// 97.560883
System.out.println(formatNum(Double.parseDouble("9.756088256835938E+1")));
// 9.756E+11
System.out.println(formatNum(Double.parseDouble("9.756088256835938E+11")));
// 0.0009756
System.out.println(formatNum(Double.parseDouble("9.756088256835938E-4")));
// -9.8E+111
System.out.println(formatNum(Double.parseDouble("-9.756088256835938E+111")));
}
private static final int MAX_LENGTH = 9;
private static String formatNum(double number) {
String out = null;
for ( int i = 0; i < MAX_LENGTH; i++ ) {
String format = "%." + i + "G";
out = String.format(format, number);
if ( out.length() == MAX_LENGTH ) {
return out;
}
}
return out; //the best we can do
}
模式中的“G”指示格式化程序在允许相同或更好的精度时放弃使用指数。我们增长到最大长度,并在输出字符串达到 10 个字符时停止。我认为您可以对 DecimalFormat
采取相同的方法,但我更熟悉 Formatter
。
关于Java:如何格式化具有第十个指数的字符串数字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5339963/