Как мне отобразить значения ненаучного формата в JLabel и JTextField?

#java #jlabel #scientific-notation

#java #jlabel #научная нотация

Вопрос:

У меня есть строковое значение, которое может содержать двойное, целое, ascii или байтовое значение, и я помещаю это значение в JLabel. Я бы хотел, чтобы значения double и long были в форме 4000000000000 вместо стиля печати java JLabel по умолчанию 4.0E12 . Теперь я знаю, какой тип данных находится в строке, но я не знаю, как заставить JLabel отображать только ненаучные формы для двойных и целых значений.

Вот что я пробовал до сих пор:

 String str = value; // string that holds the value

switch (var) // var that says which data type my str is
{
  case LONG:
  //convert my string from scientific to non-scientific here
  break;
  case DOUBLE:
  //convert my string from scientific to non-scientific here
  break;
  case ASCII:
  //do nothing
  break;
  ...
}

JLabel label = new JLabel();
label.setText(str); //Want this to be in non-scientific form
  

но этот метод по-прежнему печатает только научную форму.

Редактировать:

Мое преобразование выглядит следующим образом:

 str = new DecimalFormat("#0.###").format(str);
  

также да, это длинное значение, я опустил некоторые переменные типа данных для ясности.
Я не знаю, сработает ли это для каждого случая, хотя, даже если я заставлю это работать. Мне нужно, чтобы это работало для целых чисел, long, xtended, double и float.

Комментарии:

1. Похоже, ваше преобразование неверно. Можете ли вы предоставить код для выполнения преобразования? JLabel напечатает только тот текст, который вы ему задаете. Если текст неправильный, вы даете ему неправильный текст. Кстати, у вас не может быть int такого большого значения, вы имеете в виду long ?

2. @Peter Lawrey: Я предоставил дополнительный код вместе с подробным объяснением int to

Ответ №1:

Вы, должно быть, используете другой JLabel, потому что он не выполняет никакого преобразования по умолчанию

 JFrame frame = new JFrame();
JLabel label = new JLabel();
DecimalFormat df = new DecimalFormat("#0.###");
label.setText(df.format(4e12));
frame.add(label);
frame.pack();
frame.setVisible(true);
  

Отображает окно с

 4000000000000
  

Я просто получаю следующее с этим преобразованием

 DecimalFormat df = new DecimalFormat("#0.###");
System.out.println(df.format(400000000));
System.out.println(df.format(4000000000000L));
System.out.println(df.format(4e12f));
System.out.println(df.format(4e12));
  

С принтами

 400000000
4000000000000
3999999983616   <- due to float rounding error.
4000000000000
  

Комментарии:

1. Да, это правильный способ сделать это, на самом деле у меня был другой, но это приводило к тому, что он выводил неправильные значения. Спасибо!