【问题标题】:How to determine max size of DecimalFormat before it's shown with exponent?如何在以指数显示之前确定 DecimalFormat 的最大大小?
【发布时间】:2011-06-16 02:07:33
【问题描述】:

我在 EditText 中显示的数字可以达到 20 个字符 + 4 个小数,然后才太长。我想要的数字比最后显示的数字长,所以它不会被截断。

例如:123456789 将按原样显示 123456789123456789123456 太长,会显示为 1.123456789E8(只是一个例子!)

我已经测试过了:

DecimalFormat df = new DecimalFormat("#.####");
df.setMaximumIntegerDigits(20);

但在 20char 之后,数字显示不正确。例如:123456789123456789123456 变为 56789123456789123456(中继 4 个第一个数字。)

谢谢!

【问题讨论】:

    标签: java android numbers decimal


    【解决方案1】:

    E 用于格式化指数符号中的数字。这就是你要找的吗?

    new DecimalFormat("####E0") 
    

    我不确定什么是显像剂。

    【讨论】:

    • 如果数字大于或等于10000000000000000000,则使用此格式,否则使用其他格式。如果您正在阅读字符串,这同样简单,您可以使用长度。
    【解决方案2】:

    抱歉,Exposant 在法语中是指数!

    这项工作,但我只想在数字超过 20 个字符时使用指数格式。如果它是 20 或更少的字符,如果有的话,我想要 4 位小数...

    【讨论】:

    • 最好编辑您的问题,而不是将其添加为答案
    【解决方案3】:

    Decimal Formater java doc 描述了如何处理指数。

    科学记数法

    科学计数法中的数字是 表示为尾数的乘积 和 10 的幂,例如 1234 可以表示为 1.234 x 10^3。这 尾数通常在 1.0

    比较困难的部分是如何在正常和科学记数法之间切换。 我通过在 Messageformater 内的 choide 格式化程序中嵌入两个十进制格式化程序来做到这一点:

    MessageFormat format = new MessageFormat(
    "{0,choice,0#{0,number,'#,##0.####'}|99999<{0,number,'000000.####E0'}}",
                    Locale.ENGLISH);
    

    (此示例只有 6 位小数,但您可以更改它。)

    消息格式的使用与十进制格式器有点不同,因为格式方法需要一个对象数组。

    System.out.println(format.format(new Object[] { 123 }));
    

    它为 (1, 12, 123, ...) 打印的内容是:

    1
    1.1
    12
    123
    1,234
    12,345
    123456E0
    123456.7E1
    123456.78E2
    123456.789E3
    123456.789E4
    123456.789E5
    123456.789E6
    

    您需要稍微调整模式以使其符合您的 20 位数字的要求,但方式应该是明确的。

    即使我已经证明它有效,我还是建议您实现自己的格式器,它使用 2 个十进制格式器和一个 if 条件。

    【讨论】:

      【解决方案4】:

      感谢拉尔夫!正是我想要的!

      我做了什么:

      MessageFormat df = new MessageFormat("{0,choice,0#{0,number,'#.####'}|9999999999999999999<{0,number,'#.######E0'}}",
      Locale.ENGLISH);
      EditText2.setText(String.valueOf(df.format(new Object[] { Float.valueOf(EditText1.getText().toString()) * 1024})));
      

      【讨论】:

        猜你喜欢
        • 2016-07-23
        • 2011-10-31
        • 1970-01-01
        • 2018-02-18
        • 2022-01-15
        • 2020-10-04
        • 1970-01-01
        • 2015-11-28
        • 1970-01-01
        相关资源
        最近更新 更多