我正在使用Fortran程序,它希望使用Fortran的E
格式说明符输入浮点数,这是科学计数法,除了尾数必须介于0和1之间。所以而不是:
"3147.3" --> "3.1473E3",
需要
"3147.3" --> "0.31473E4".
我无法修改Fortran程序,因为它适用于其他一些特殊的程序。
看起来C#E
格式字符串会给我前者。有没有简单的方法在C#中实现后者?
答案 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))
));
}
}