Спецификатор формата .NET для научной нотации с мантиссой от 0 до 1 - PullRequest
2 голосов
/ 16 августа 2010

Я работаю с программой на Фортране, которая ожидает ввода чисел с плавающей запятой с использованием спецификатора формата E Фортрана, который является научной нотацией, за исключением того, что мантисса должна быть между 0 и 1 .Поэтому вместо:

"3147.3" --> "3.1473E3",

ему нужно

"3147.3" --> "0.31473E4".

Я не могу изменить программу Fortran, так как она работает с несколькими другими программами, которые также являются специфическими.

Похоже, что строка формата C # E даст мне первое.Есть ли простой способ добиться последнего в C #?

Ответы [ 4 ]

3 голосов
/ 16 августа 2010

Вы можете указать пользовательский формат следующим образом.

var num = 3147.3;
num.ToString("\\0.#####E0"); // "0.31473E4"
2 голосов
/ 16 августа 2010

Я думаю, что вы решаете несуществующую проблему.Это правда, что по умолчанию спецификатор Fortran E output имеет начальный ноль перед десятичной точкой (это можно изменить).Но когда спецификатор E используется для input , он очень терпим и не требует начального нуля - если у вас есть десятичная точка в числе и число соответствует столбцам, указанным в формате, этобудет работать.

Вот пример программы на Фортране и пример входного файла.

program test_format

real :: num1, num2, num3

open (unit=16, file="numbers_3.txt", status='old', access='sequential', form='formatted', action='read' ) 

read (16, 1010 ) num1
read (16, 1010 ) num2
read (16, 1010 ) num3

1010 format (E9.5)

write (*, *) num1, num2, num3

stop

end program test_format

и пример ввода с тремя разными случаями:

3.1473E3
0.31473E4
3147.3

IПротестировал программу с gfortran и Intel ifort.Вывод был:

 3147.300       3147.300       3147.300

Таким образом, при выполнении ввода с использованием спецификатора формата Fortran's E необязательно, чтобы цифра перед десятичной точкой была равна нулю.Нет необходимости даже в том, чтобы входное значение использовало E-нотацию!

Редактировать / PS Я перевел программу в исходную компоновку с фиксированной формой FORTRAN 77 и скомпилировал ее с g77 - он прочитал три номера тестапросто хорошо.Электронный формат долгое время был гибким для ввода - возможно, начиная с FORTRAN IV, возможно, дольше.

0 голосов
/ 16 августа 2010

Вы можете взять что-то похожее на решение Джеффа М и реализовать его с помощью метода расширения:

public static class DoubleExtensions
{
    public static string ToFortranDouble(this double value)
    {
        return value.ToString("\\0.#####E0");
    }
}

class Program
{
    static void Main(string[] args)
    {
        string fortranValue = 3147.3.ToFortranDouble();
        System.Console.WriteLine(fortranValue);
    }
}

Или для чего-то немного более сложного (не уверен, какую точность дает Фортран с плавающей / двойной точностью):

public static class DoubleExtensions
{
    public static string ToFortranDouble(this double value)
    {
        return value.ToFortranDouble(4);
    }

    public static string ToFortranDouble(this double value, int precision)
    {
        return string.Format(value.ToString(
            string.Format("\\0.{0}E0", new string('#', precision))
            ));
    }
}
0 голосов
/ 16 августа 2010

Представление чисел с плавающей или двойной точностью определено в IEEE754 / IEC 60559: 1989. Вы должны искать, чтобы найти библиотеки для извлечения мантиссы и экспоненты. Затем вы можете просто разделить к тому времени, чтобы перейти к запятой и вычесть количество шагов из показателя степени для формирования вашего решения.

...