Как определить максимальный размер DecimalFormat перед показом с показателем степени? - PullRequest
3 голосов
/ 26 января 2011

У меня есть число, отображаемое в EditText, которое может содержать до 20 символов + 4 десятичных знака, прежде чем это станет слишком длинным. Я хотел бы, чтобы номер, который был длиннее, отображался с деэкспонентом в конце, чтобы он не усекался.

ex: 123456789 покажет как есть 123456789123456789123456 слишком длинный и будет отображаться как 1.123456789E8 (просто пример!)

Я проверял это:

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

Но после 20чар цифры просто не отображаются корректно. например: 123456789123456789123456 стал 56789123456789123456 (транкинга 4 первая цифра.)

Спасибо!

Ответы [ 4 ]

4 голосов
/ 26 января 2011

Десятичный форматер java doc описывает, как обращаться с экспонентой.

Научная нотация

Числа в научной нотации выражаются как произведение мантиссы, а степень десяти, например, 1234, может быть выражена как 1,234 x 10 ^ 3.Мантисса часто находится в диапазоне 1,0 <= х <10,0, но это не обязательно.DecimalFormat может быть задан для форматирования и анализа научной нотации только через шаблон;в настоящее время нет фабричного метода, который бы создавал формат научной нотации.В шаблоне знак экспоненты, за которым сразу следует один или несколько цифр, обозначает научное обозначение.Пример: «0. ### E0» форматирует число 1234 как «1.234E3».... </p>

Более сложная часть состоит в том, как переключаться между обычной и научной нотацией.Я сделал это, вставив два десятичных форматера в форматирующий элемент выбора в Messageformater:

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 дигетов, но путь должен быть ясным.

Даже если бы я показал, что это работает, я бы порекомендовал реализовать свой собственный Formater, который использует 2 десятичных форматера и условие if.

0 голосов
/ 27 января 2011

Спасибо, Ральф!Именно то, что я искал!

Вот что я сделал:

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})));
0 голосов
/ 26 января 2011

Извините, Exposant - это Exponent по-французски!

Эта работа, но я бы хотел иметь экспоненциальный формат только тогда, когда число превышает 20 символов.И если это 20 или менее символов, я хочу иметь 4 десятичных знака, если есть ...

0 голосов
/ 26 января 2011

E используется для форматирования числа в экспоненциальной записи. Это то, что вы ищете?

new DecimalFormat("####E0") 

Я не уверен, что такое экспонент.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...