Форматирование строки для удаления научной нотации — Java

У меня есть следующий код, который разбивает строку чисел (разделенных пробелом), а затем создает массив с плавающей запятой:

//Split the string and then build a float array with the values.
String[] tabOfFloatString = value.split(" ");
int length = tabOfFloatString.length;
System.out.println("Length of float string is" + length);
float[] floatsArray = new float[length];
for (int l=0; l<length; l++) {
float res = Float.parseFloat(tabOfFloatString[l]);
    System.out.println("Float is " + res);
    floatsArray[l]=res;
}

Проблема в том, что некоторые значения в строке отформатированы в экспоненциальном формате — например, они читаются как -3.04567E-8.

То, что я хочу сделать, это получить поплавок, который не содержит числа E.

Я читал эту ветку, в которой говорится, что я мог бы использовать BigDecimal, однако не могу заставить это работать - это лучший подход или мне стоит попробовать что-то еще? Как преобразовать строку 3.0103 E-7 в 0.00000030103 в Java?


person GuybrushThreepwood    schedule 09.05.2012    source источник
comment
Поплавок не содержит числа E. Научная нотация — это один из способов представления чисел с плавающей запятой. Если формат по умолчанию вам не подходит, загляните в java.text.DecimalFormat.   -  person theglauber    schedule 09.05.2012


Ответы (3)


Ниже ваш код немного изменен. Как по мне, это работает хорошо и на самом деле не заботится о порядке показателей:

public void function() {
    String value = "123456.0023 -3.04567E-8 -3.01967E-20";
    String[] tabOfFloatString = value.split(" ");
    int length = tabOfFloatString.length;
    System.out.println("Length of float string is" + length);
    float[] floatsArray = new float[length];
    for (int l = 0; l < length; l++) {
        String res = new BigDecimal(tabOfFloatString[l]).toPlainString();
        System.out.println("Float is " + res);
        floatsArray[l] = Float.parseFloat(res);
    }

}
person dharam    schedule 09.05.2012

Принятый ответ не работает для меня, когда

floatsArray[l] = Float.parseFloat(res);

Float.parseFloat(res) меняет ненаучную аннотацию на научную, поэтому мне пришлось ее удалить.

Этот работал:

public String[] avoidScientificNotation(float[] sensorsValues)
{
     int length = sensorsValues.length;
     String[] valuesFormatted = new String[length];

     for (int i = 0; i < length; i++) 
     {
         String valueFormatted = new BigDecimal(Float.toString(sensorsValues[i])).toPlainString();
         valuesFormatted[i] = valueFormatted;
     }
    return valuesFormatted;
}
person Copper Copperone    schedule 02.12.2014

Поплавок не содержит e, именно так он отображается для вас. Вы можете использовать DecimalFormat, чтобы изменить способ отображения.

http://ideone.com/jgN6l

java.text.DecimalFormat df = new java.text.DecimalFormat("#,###.######################################################");
System.out.println(df.format(res));

Однако вы заметите некоторые странные числа из-за плавающей запятой.

person James Montagne    schedule 09.05.2012