【问题标题】:Java/Android - set DecimalFormat to show only mantissaJava/Android - 将 DecimalFormat 设置为仅显示尾数
【发布时间】:2014-05-03 02:09:22
【问题描述】:

我只想显示数字的尾数,而与指数无关。

12.4e-6 after formatting => 12.4

12.4e-12 after formatting => 12.4

手动进行计算很简单。但问题是我需要使用 DeciamalFormat 类,因为我必须将它作为参数提供给另一个类。我试过这个:

DecimalFormat mFormat = (DecimalFormat) NumberFormat.getInstance();
mFormat.applyPattern("#.#E0");

如果我删除 E 符号,尾数将不会被计算。有没有办法使用这个DecimalFormat 只显示mantissa

【问题讨论】:

  • 124e-7 = 12.4e-6 = 1.24e-5 = 0.124e-4 所以你想打印一个 124 = 0.124 的数字?
  • 或者你只是想乘以 1e6?例如12.4e-6 => 12.4 但 1.24e-6 => 1.24 和 1.24e-3 => 1240
  • 12.4e-6 = 12400000e-12 你想要哪个号码?
  • 我不想乘以 1e6 等特定因子。我想有两个整数数字,然后是两个小数数字并忽略指数。 12.4e-12 => 12.4(输出是格式化后的字符串)1233e-12 => 12133 0.12e-5 => 0.12 所以只是尾数。
  • 我的观点是,您声明的要求毫无意义,因为 1233e-12 与 1.233e-6 的数字相同,所以根据您的要求,它应该打印什么?同一个数字不能有多个可能的输出。

标签: java android number-formatting decimalformat mantissa


【解决方案1】:

我很确定你不能,因为你要求 DecimalFormat 显示与你所代表的数字不同的数字

如果您需要字符串格式,为什么不应用 DecimalFormat 来返回字符串 12.4,然后将 e 前面的部分子字符串化?或者只是根据指数相乘?

【讨论】:

  • 我不能这样做的原因是因为我必须将 DecimalFormat 实例提供给正在执行自己的计算的类,然后根据指定的格式显示数字。除了使用 DecimalFormat 类指定格式之外,我无法控制此类显示的数字。
  • DecimalFormat 是否作为参数传递?如果是这样,您可以将其扩展为自定义十进制格式吗?
  • 是的,它作为参数传递。我希望能够扩展它,但搜索了没有成功的示例。
  • 太棒了!我编写了自己的函数,它似乎可以工作。谢谢。我会尽快用代码发布答案。
【解决方案2】:

要获得数字前两位小数,后一位小数,您可以执行以下操作。

String s = String.format("%4.1f", d / 
                              Math.pow(10, (int) (Math.log10(Math.abs(d)) - 1)));

当然相信 999 => 99.9 之后的数字是 1000 => 10.0 简直是疯了。

【讨论】:

    【解决方案3】:

    我找到了以下解决方案:我重写了 NumberFormat 类的方法,以便我可以操作如何将 Double 值转换为字符串:

    public class MantissaFormat extends NumberFormat {  
    @Override
    /** Formats the value to a mantissa between [0,100] with two significant decimal places. */
    public StringBuffer format(double value, StringBuffer buffer, FieldPosition field) {
    
    String output;
    String sign="";
    
    if(!isFixed)
    {
        if(value<0)
        {
          sign = "-";
          value = -value;
        }
    
        if(value!=0) {
    
            while(value<1) {            
              value *= 100;
            }  
            while(value>100){                   
             value/=100; 
            }    
        }
    }
    // value has the mantissa only. 
    output = sign + String.format( "%.2f", value );    
    buffer.append(output);
    return buffer;
    }
    
    @Override
    public Number parse(String string, ParsePosition position) {
    // TODO Auto-generated method stub
    throw new UnsupportedOperationException();    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-02
      • 1970-01-01
      • 2015-12-02
      • 1970-01-01
      • 1970-01-01
      • 2018-11-23
      相关资源
      最近更新 更多