【问题标题】:Fortran I/O Descriptors in Java?Java中的Fortran I/O描述符?
【发布时间】:2012-02-03 03:06:36
【问题描述】:

我目前不得不通过创建程序需要读入的 ascii 输出文件来与旧版 Fortran 程序交互,执行一些计算,然后我必须解析二进制输出。在大多数情况下,我有这个工作,但我遇到了一个小障碍。

我遇到的问题是 Fortran 描述符。有没有一种简单的方法可以将像 E9.3 这样的描述符放入 Java 中的 DecimalFormat 对象中?

我的 DecimalFormat 仅适用于小于 1 的数字。对于小于 1 的数字,例如 0.123,它们用指数上的符号写出,如 1.230E-01。但是,对于大于 1 (12.345) 的数字,它们被写为 1.234E01 而不是 1.234E+01。据我所知,该程序期望“+”号作为指数的一部分。

我当前使用的 DecimalFormat 字符串是“#0.000E00”,如果需要,我目前正在拉一些字符串操作以在其中插入“+”(在 E 之后但在数字之前)。必须有更好的方法来做到这一点。任何帮助将不胜感激。

【问题讨论】:

  • String.format("%e", 123.456); 为我返回 1.234560e+02
  • 问题是总的字符串需要9个,而且只有9个字符长。本质上,您的示例编号需要为 1.235E+02,我不确定如何将其强制为一定长度。
  • 查看 DecimalFormat 规范(我从未亲自使用过),它似乎相当不灵活。除了后处理之外,没有明显的技巧可以实现您想要的。
  • @K.Niemczyk 我对 Fortran 不熟悉,所以我只关注您解释的问题的一部分。我会看到一个更完整的答案。

标签: java fortran decimalformat


【解决方案1】:

你确定你需要这个吗?也许它只是一个编译器扩展,但值得检查 Fortran 程序是否真的接受您的表单 1.234E01。我的两个编译器(gfortran 和 Solaris Studio)都使用 E9.3 编辑描述符接受它们。

【讨论】:

  • 事实证明我们的规范中存在沟通错误。遗留系统采取任何一种方式。谢谢。
【解决方案2】:

如果您可以访问 fortran 程序的源代码,则可以将其更改为使用 * 描述符读取输入文件,例如如果您读取 data 的数组 n 值,例如改变这个:

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

类似于:

read(iUnit, *) data(10)

或将文件写入无格式,然后读入二进制数据。

【讨论】:

    【解决方案3】:

    如果您需要整个字符串为 9 个字符,这意味着小数部分将剩下三个字符。您可以使用printf 样式格式来表达这一点,如下所示:

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

    如果您需要它总共包含 9 个字符,即使是负数,前导的“-”也会影响字符数,您必须给我们一个 if 才能为负数使用不同的格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-07
      • 1970-01-01
      • 1970-01-01
      • 2019-12-15
      相关资源
      最近更新 更多