用于科学记数法的.NET格式说明符,尾数在0和1之间

时间:2010-08-15 21:06:00

标签: c# string format fortran

我正在使用Fortran程序,它希望使用Fortran的E格式说明符输入浮点数,这是科学计数法,除了尾数必须介于0和1之间。所以而不是:

"3147.3" --> "3.1473E3",

需要

"3147.3" --> "0.31473E4".

我无法修改Fortran程序,因为它适用于其他一些特殊的程序。

看起来C#E格式字符串会给我前者。有没有简单的方法在C#中实现后者?

4 个答案:

答案 0 :(得分:3)

您可以指定自定义格式。

var num = 3147.3;
num.ToString("\\0.#####E0"); // "0.31473E4"

答案 1 :(得分:2)

我认为你正在解决一个不存在的问题。确实,Fortran E 输出说明符的默认值在小数点之前有一个前导零(可以修改)。但是当E说明符用于输入时,它是非常宽容的并且不需要前导零 - 如果数字中有小数点且数字符合格式指定的列,它会起作用。

以下是Fortran程序示例和示例输入文件。

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

我用gfortran和Intel ifort测试了这个程序。输出是:

 3147.300       3147.300       3147.300

因此,当使用Fortran的E格式说明符执行输入时,小数点前的数字不必为零。输入值甚至不必使用E-notation!

编辑/ P.S.我将程序翻译成FORTRAN 77的固定格式源代码布局并用g77编译 - 它读取三个测试数字就好了。电子格式在很长一段时间内都很灵活 - 可能是自FORTRAN IV以来,可能更长。

答案 2 :(得分:0)

浮动或双打的代表在IEEE754 / IEC 60559:1989中定义。您应该查找库以提取尾数和指数。然后,您可以按此除以移动到逗号并从指数中减去步数以形成解决方案。

答案 3 :(得分:0)

您可以采用类似于Jeff M的解决方案,并通过扩展方法实现它:

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);
    }
}

或者更复杂的东西(不确定Fortran漂浮/双打的精确度):

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))
            ));
    }
}