2012-02-03 2 views
1

В настоящее время мне приходится взаимодействовать с устаревшей программой Fortran, создавая файл вывода ascii, который программа должна читать, выполнять некоторые вычисления, а затем я должен разбирать двоичный вывод. По большей части, у меня это работает, но я сталкиваюсь с небольшой проблемой.Дескрипторы ввода/вывода Fortran в Java?

Проблема, с которой я столкнулся, связана с дескрипторами Fortran. Есть ли простой способ получить дескриптор типа E9.3 в объект DecimalFormat в Java?

DecimalFormat У меня есть работы только для чисел меньше 1. Для чисел < 1, таких как 0.123, они выписываются со знаком экспоненты, как 1.230E-01. Однако для чисел, больших 1 (12.345), они записываются как 1.234E01, а не 1.234E + 01. Из того, что мне говорят, программа ожидает, что знак «+» станет частью экспоненты.

Строка DecimalFormat, которую я использую сейчас, «# 0.000E00», и в настоящее время я пытаюсь манипулировать строкой, чтобы вставить туда «+» (после E, но до цифр), если это необходимо. Должен быть лучший способ сделать это. Любая помощь будет оценена.

+0

'String.format ("% e ", 123.456);' возвращает '1.234560e + 02' для меня. – millimoose

+0

Проблема в том, что общая строка должна быть 9 и всего 9 символов. По сути, номер вашего примера должен быть 1.235E + 02, и я не уверен, как заставить его на определенную длину. –

+0

Глядя на спецификацию DecimalFormat (я никогда не использовал ее лично), она выглядит довольно негибкой. Нет очевидного трюка для достижения того, чего вы хотите, кроме пост-обработки. –

ответ

2

Вы действительно уверены, что вам это нужно? Возможно, это только расширение компилятора, но стоит проверить, действительно ли программа Fortran принимает вашу форму 1.234E01. Мои оба компилятора (gfortran и Solaris Studio) принимают их с дескриптором редактирования E9.3.

+0

Оказалось, что в нашей спецификации есть недопонимание. Унаследованная система принимает это в любом случае. Благодарю. –

1

Если у вас есть доступ к источнику программы fortran, вы можете изменить его, чтобы прочитать входной файл, используя дескриптор *, например. если вы читаете в массиве data значений n, например. изменить:

read(iUnit,'(10E9.3)') data(10) 

к чему-то вроде:

read(iUnit, *) data(10) 

или записать файл неформатированный, а затем прочитать в двоичных данных.

0

Если вам нужна целая строка в 9 символов, это означает, что для десятичной части останется три символа. Вы можете выразить это с printf стиля форматирования, как это:

groovy:000> String.format("%.3E", 0.00)   
===> 1.235E-04 
groovy:000> String.format("%.3E", 1234.56789)   
===> 1.235E+03 

Если вам это нужно, чтобы быть девять символов в общей сложности даже для отрицательных чисел, с ведущим «-» считая против количества символов, вы должны будете us a if использовать другой формат для отрицательных чисел.