2015-07-21 75 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