在Java String中解析和替换双精度数

Jit*_*Jit 2 java regex double parsing substring

我正在编写用于翻译信号的java代码.如果给定的字符串(INPUT)是:

C*12.387a0d14assc7*18.65d142a
Run Code Online (Sandbox Code Playgroud)

它的翻译(OUTPUT)应该是:

C*12387:1000a0d14assc7*1865:100d142a 
Run Code Online (Sandbox Code Playgroud)

算法:

在字符串中的任何地方,星号(*)跟随包含小数的数字(在此字符串中有两个,首先是'*12.387',第二个是*18.65'),此数字将被更改为分数,如上例所示12.387转换为12387:1000和18.65转换为1865:100

如果十进制数被隔离,我可以使用以下代码将其转换为分数:

    double d = 12.387;
    String str = Double.toString(d);        
    String[] fraction = str.split("\\.");

    int denominator = (int)Math.pow(10, fraction[1].length());
    int numerator = Integer.parseInt(fraction[0] + "" + fraction[1]);

    System.out.println(numerator + ":" + denominator);
Run Code Online (Sandbox Code Playgroud)

但我不知道如何将十进制数的子串与它包含的字符串分开.刚接触java和编程我需要帮助.谢谢你的期待.

ben*_*y23 6

使用正则表达式和捕获组是实现解析的好方法:

String s = "C*12.387a0d14assc7*18.65d142a";
StringBuffer result = new StringBuffer();
Matcher m = Pattern.compile("\\*(\\d+)\\.(\\d+)").matcher(s);
while (m.find()) {
    String num = m.group(1);
    String denom = m.group(2);
    String divisor = "1" + new String(new char[denom.length()]).replace("\0", "0");
    String replacement = "*" + num + denom + ":" + divisor;
    m.appendReplacement(result, replacement);
}
m.appendTail(result);
System.out.println(result.toString());
Run Code Online (Sandbox Code Playgroud)