使用固定数量的小数位以工程符号格式化双精度数

时间:2016-06-07 12:16:02

标签: java format

我想使用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);
    }
}

2 个答案:

答案 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);
   }
}