我正在编写用于翻译信号的Java代码。如果给定的字符串(INPUT)为:
C*12.387a0d14assc7*18.65d142a
其翻译(OUTPUT)应该是:
C*12387:1000a0d14assc7*1865:100d142a
算法:
字符串中的每一个star(*)跟随一个包含小数的数字(在此字符串中有两个,第一个为'* 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);
但是我不怎么将十进制数的子字符串从它包含的字符串中分离出来。我是Java和编程新手,需要帮助。谢谢您的期待。
最佳答案
使用正则表达式和捕获组是实现解析的好方法:
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());