2014-01-16 30 views
4

我創建了一個對象MyString。我無法弄清楚如何重新創建valueOf(double d)。我爲整數重新創建了valueOf。爲了使它更容易,我將小數位數限制爲8.如何重新創建valueOf(double d)?在Java的String類中重新創建valueOf(double d)

public class MyString { 

private char[] a; 

public MyString(String s) { 
    this.a = s.toCharArray(); 
} 

public MyString(char[] a) { 
    this.a = a; 
} 

public String toString() { 
    return new String(a); 
} 

public int length() { 
    return a.length; 
} 

public char charAt(int i) { 
    return a[i]; 
} 
    public static MyString valueOf(int i) { 
    int digits = (int)(Math.log10(i)+1); 
    char[] b = new char[digits]; 
    for (int j = 0; j < digits; j++) { 
     b[j] = (char) (48 + i/10); 
     i = i % 10; 
     if (i < 10) { 
      b[j + 1] = (char)(48 + i); 
      break; 
     } 
    } 
    MyString ms = new MyString(b); 
    return ms; 
    } 
public static MyString valueOf(double d) { 
      char[] d1 = new char[digits]; 
      //Take each digit of the number and enter it into the array 
      MyString ms = new MyString(d1); 
    return ms; 

} 

public static void main(String[] args) { 

} 

}

+0

你爲什麼不看「Double」類的源代碼,看看它們是如何實現的? –

+0

交給Double.toString(雙)?或者搜索一般的浮點到字符串轉換。 – keshlam

回答

1

我假設你是爲了好玩而這麼做的......所以這是我採取的方法。你已經有了valueOf(int i),所以爲什麼不基本重用這個函數。只需要加倍,並保持乘以10直到你有一個整數。跟蹤小數位的位置,然後基本上調用你的valueOf(int i),但也包含小數點。

我在運行代碼時遇到了問題,所以重新執行了valueOf(int i),然後創建了valueOf(int i,int decimalSpot),傳入-1或0來表示小數點,然後是整數值使用小數位。

無論如何,這是我想出來的。這很晚了,所以可能不是最乾淨的代碼,但應該給你一個概念證明。

public class MyString { 

    private char[] a; 

    public MyString(String s) { 
     this.a = s.toCharArray(); 
    } 

    public MyString(char[] a) { 
     this.a = a; 
    } 

    public String toString() { 
     return new String(a); 
    } 

    public int length() { 
     return a.length; 
    } 

    public char charAt(int i) { 
     return a[i]; 
    } 

    public static MyString valueOf(int i) { 
     return MyString.valueOf(i,-1); 
    } 

    public static MyString valueOf(double d) { 
     int decimalPlace = 0; 

     while (d != (int)d) 
     { 
      decimalPlace++; 
      d = d*10; 
     } 

     return MyString.valueOf((int)d,decimalPlace); 
    } 

    public static MyString valueOf(int i, int decimalSpot) { 
     int index=0; 
     int digits = (int)(Math.log10(i)+1); 
     int stringLength=digits; 
     if (decimalSpot == 0) decimalSpot=-1; // Don't return 1234. - just return 1234 
     if (decimalSpot != -1) 
     { 
      // Include an extra spot for the decimal 
      stringLength++; 
     } 
     char[] b = new char[stringLength]; 
     for (int j = digits-1; j >= 0; j--) { 
      int power = (int) Math.pow(10,j); 
      int singleDigit = (int) Math.floor(i/power); 
      i = i - power*singleDigit; 
      b[index++] = (char) (48 + singleDigit); 

      if (decimalSpot==j) 
      { 
       b[index++] = '.'; 
      } 
     } 

     MyString ms = new MyString(b); 
     return ms; 
    } 

    public static void main(String[] args) {   
     MyString ms = MyString.valueOf(12345); 
     System.out.println(ms); 

     ms = MyString.valueOf(12345.12313); 
     System.out.println(ms); 
    } 

} 
0

而不是試圖解決這個問題的每一個可能的源數據類型,你應該只專注於從字符串構造類。然後,你所要做的就是在每種情況下將這個方法和你還沒有完成的所有其他對象委託給相應的String方法,然後取出生成的String並用該String構造對象。

相關問題