java - 用指数符号Java解析复数
问题描述
试图从 csv 文件中读取一些复数。我有一个字符串并且正在尝试
ComplexFormat cf = new ComplexFormat();
cf.parse(entry)
此代码导致以下错误
org.apache.commons.math3.exception.MathParseException: illegal state: string "-7.5212e-06+3.4298e-06i" unparseable (from position 7) as an object of type org.apache.commons.math3.complex.Complex
我假设我需要使用允许指数表示法的 NumberFormat 创建一个新的复杂格式,因为
cf.getRealFormat().useExponentialNotation = false
但是我不确定如何创建这样的 NumberFormat。我正在考虑使用 Double.parseDouble ,但这需要我考虑正确的正则表达式。
解决方案
您的数据似乎包含带有小 e 的科学记数法。令人讨厌的是该库不会拦截,但一个简单的替换将对您的情况有所帮助。
String entry = "-7.5212e-06+3.4298e-06i";
ComplexFormat cf = new ComplexFormat();
Complex c = cf.parse(entry.replace('e', 'E'));
System.out.println(c);
//(-0.075212, 0.034298)
但请注意,如果您使用默认构造函数(如上),您的数字将被正确解析,但科学记数法将不再保留。如果要保留符号,请使用 DecimalFormat:
DecimalFormatSymbols symbols = new DecimalFormatSymbols(Locale.US);
DecimalFormat formatter = new DecimalFormat("##.####E0", symbols);
ComplexFormat cfWithE = new ComplexFormat(formatter);
Complex c2 = cfWithE.parse(entry.replace('e', 'E'));
System.out.println(c2);
//(-7.5212E-6, 3.4298E-6)
推荐阅读
- excel - 通过二维数组纠正错误,然后用新数据替换单元格
- swiftui - SwiftUI - 在应用程序中从我的网站打开链接
- javascript - android模拟器默认位置未显示
- python - Python Chefboost 功能重要性 找不到像 output/rules/rules_fi.csv 这样的文件
- apache - 带有 p12 文件的 Apache SSL 密码短语
- cereal - Cereal 在 Linux 上从 Windows 反序列化二进制文件失败
- r - 从 R 中的向量/矩阵或数据帧中查找索引
- mysql - sql从同一张表中选择和删除
- unity3d - 如何处理嵌套刚体?
- javascript - 在 node.js 中,如何读取 DOM 主体的背景颜色属性?