我想使用DecimalFormat
格式化工程符号中的数字(指数是3的倍数)并使用固定数量的小数位数。小数位数应该由模式配置。
java.text.DecimalFormat
类可以实现吗?
还有其他选择吗?
以下是输出12.345E3而不是12.34E3的测试用例:
public static void main(String[] args)
{
Locale.setDefault(Locale.ENGLISH);
DecimalFormat df = new DecimalFormat("##0.00E0");
String realOutput = df.format(12345);
String expected = "12.34E3";
System.out.println(realOutput);
if (Objects.equals(realOutput, expected))
{
System.out.println("OK");
}
else
{
System.err.println("Formatted output " + realOutput + " differs from documented output " + expected);
}
}
答案 0 :(得分:0)
您应该使用以下内容:
DecimalFormat format = new DecimalFormat("##0.0E0");
此处http://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html
您可以在#34; Science Notation"
的部分内找到您的问题的答案科学记数法中的数字表示为a的乘积 尾数和十的幂,例如,1234可以表示为 1.234 x 10 ^ 3。尾数通常在1.0 <= x <1的范围内。 10.0,但它不一定是。可以指示DecimalFormat进行格式化和解析 科学记法只能通过一种模式;目前没有工厂 创建科学记数法格式的方法。在一个模式中, 指数字符后紧跟一个或多个数字 字符表示科学记数法。示例:&#34; 0。### E0&#34;格式 数字1234为&#34; 1.234E3&#34;。
指数字符后的数字字符数 最小指数位数。没有最大值。否定指数 使用本地化的减号,而不是前缀和格式 模式的后缀。这允许诸如&#34; 0。### E0 m / s&#34;之类的模式。 解释最小和最大整数位数 together:如果最大整数位数大于 它们的最小数量大于1,它强制指数为 最大整数位数的倍数和最小值 要解释为1的整数位数。最常用的 这是生成工程符号,其中指数是 三个的倍数,例如&#34; ## 0。##### E0&#34;。使用这种模式, 编号12345格式为&#34; 12.345E3&#34;和123456格式为&#34; 123.456E3&#34;。 否则,通过实现最小整数位数 调整指数。示例:0.00123格式为&#34; 00。### E0&#34; 收益率&#34; 12.3E-4&#34;。尾数中的有效位数是 最小整数和最大分数的总和,是 不受最大整数位数的影响。例如,12345格式化 与&#34; ## 0。## E0&#34;是&#34; 12.3E3&#34;。要显示所有数字,请设置重要数字 数字计数为零。有效位数不受影响 解析。指数模式可能不包含分组分隔符。
答案 1 :(得分:0)
取自this website:
private final static int PREFIX_OFFSET = 5;
private final static String[] PREFIX_ARRAY = {"f", "p", "n", "µ", "m", "", "k", "M", "G", "T"};
public static String convert(double val, int dp)
{
// If the value is zero, then simply return 0 with the correct number of dp
if (val == 0) return String.format("%." + dp + "f", 0.0);
// If the value is negative, make it positive so the log10 works
double posVal = (val<0) ? -val : val;
double log10 = Math.log10(posVal);
// Determine how many orders of 3 magnitudes the value is
int count = (int) Math.floor(log10/3);
// Calculate the index of the prefix symbol
int index = count + PREFIX_OFFSET;
// Scale the value into the range 1<=val<1000
val /= Math.pow(10, count * 3);
if (index >= 0 && index < PREFIX_ARRAY.length)
{
// If a prefix exists use it to create the correct string
return String.format("%." + dp + "f%s", val, PREFIX_ARRAY[index]);
}
else
{
// If no prefix exists just make a string of the form 000e000
return String.format("%." + dp + "fe%d", val, count * 3);
}
}