2015-07-21 37 views
2

我在编写用于翻译信号的java代码。如果给定的字符串(输入):解析和替换Java中的双精度字符串

C*12.387a0d14assc7*18.65d142a 

其翻译(OUTPUT)应为:

C*12387:1000a0d14assc7*1865:100d142a 

算法:

无论在字符串中星号(*)如下包含数字十进制(在这个字符串中有两个,第一个是'* 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和编程新手,我需要帮助。感谢预期。

回答

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()); 
+0

请添加需要提醒的是它需要StringUtils的外部库 – nhahtdh

+0

见http://stackoverflow.com/a/4903603/1737819为重复的字符串。没有外部库:) – Willmore

+0

替代的外部库 – beny23

1

我写它采用regex'es一个解决方案,但是又试图没有他们。这里的解决方案是一般的(对于任何编程语言)。当然,看看它是否比基于正则表达式的解决方案更有趣。无论如何,我怀疑基于正则表达式的解决方案可能会更快。请看看这个解决方案(虽然:)不完美:))。

import java.util.*;  

class DoubleConvert 
{ 
    public static void main (String[] args) 
    { 
     StringBuilder buffer = new StringBuilder("C*12.387a0d14assc7*18.65d142a"); 
     int j, m, k; 
     int i = 0; 
     while (i < buffer.length()) 
     { 
      if (buffer.charAt(i) == '*') 
      { 
       m = -1; k = -1; 
       j = i; //remember where * found 
       while (i + 1 < buffer.length()) 
       { 
        i++; 
        if (Character.isDigit(buffer.charAt(i))) 
        { 
         continue; 
        } 
        else if (buffer.charAt(i) == '.') 
        { 
         m = i; // remember where . found 
         while (i + 1 < buffer.length()) 
         { 
          i++; 
          if (Character.isDigit(buffer.charAt(i))) 
          { 
           continue; 
          } 
          else 
          { 
           k = i; //remember the last position 
           break; 
          } 
         } 
        } 
        else //let's see what we got 
        { 
         if (m > 0 && j > 0 && m - j > 0 && k - m > 0) //there must exist strings 
         { 
          System.out.println("Found " + buffer.substring(j, m) 
          + " second part " + buffer.substring(m, k)); 
          buffer.replace(j+1, k, 
            buffer.substring(j+1, m) + 
            buffer.substring(m+1, k) + 
            ":1" + 
            new String(new char[k-1-m]).replace("\0","0")); 
         } 
         break; 
        } 
       } 
      } 
      else 
      { 
       i++; 
      } 
     } 
     System.out.println("Result " + buffer); 
    } 
} 

输出

Found *12 second part .387 
Found *18 second part .65 
Result C*12387:1000a0d14assc7*1865:100d142a 
+0

您的此代码非常具有竞争力。它是很有教育意义的,它在所有伟大的书籍中都没有,它解决了我许多其他类似的问题。它给了我洞察力和创新。 – Jit

+0

ty为好词。 :} – Willmore