2016-10-14 118 views
0

我有號碼123.1234567890129。如何將double轉換爲15位數的字符串?

我想結果是123.123456789012沒有最後一個數字四捨五入。

我試過:你能做到這一點

("123.1234567890129").ToString("G15") //123.123456789013 
+0

[C#雙 - toString()方法保留兩位小數格式,但沒有四捨五入]的可能的複製(http://stackoverflow.com/questions/2453951/c-sharp-double-tostring-formatting-with-小數點後兩位數) –

+0

是否有任何模式,或者您希望小數點後的任何特定長度的數字? –

+0

我想精確的15位數字,例如,如果我的號碼是12345.12345678909,我期望的結果是12345。1234567890 –

回答

1

一種方法是既然你說雙舍入到16這樣

("123.1234567890129").ToString("G16").Substring(0, 16); 
+0

2個問題我可以在這裏看到,請告訴我,如果我錯了...你的子字符串包括小數,所以它會輸出'123.12345678901'而不是'123.123456789012'。其次(我相信這也是原始帖子的一個問題)是,你在一個字符串上調用'ToString(「G16」)'而不是double。如果我嘗試這樣做,我會得到一個「無法從'字符串'轉換爲'System.IFormatProvider'」錯誤。 –

+1

是的,這是正確的,謝謝我會改變那一個:)這只是概念性的,不是它發生在我會假設的實際實例,因爲它沒有分號,它甚至沒有被分配到OP的例子中的任何東西 –

+0

只是還有一點需要補充(不是說在這個特定場景中它是錯誤的)......但是由於OP總是需要15位數字,所以如果double沒有小數,則子字符串將不會按預期執行。 –

0
  1. 由於雙打可以有任意數量的數字,你必須以某種方式輪迴。 (根據推斷,或者按照實際情況推算出來,您可以向下取整)
  2. 既然您意味着您只想查看精確數字的位數,則必須找出十進制數的每邊有多少個數字點(0到15任一側上)

一種extenstion向下舍入

public static class DoubleExtensions 
{ 
    public static double RoundDown(this double value, int numDigits) 
    { 
     double factoral = Math.Pow(10, numDigits); 
     return Math.Truncate(value * factoral)/factoral; 
    } 
} 

測試用例

 const int totalDigits = 15; 

     // why start with a string?? 
     string somestring = "123.1234567890129"; 
     const int totalDigits = 15; 

     // since the title says 'convert a double to a string' lets make it a double eh? 
     double d = double.Parse(somestring); 
     int value = (int)d; 

     double digitsRight = d - value; 
     int numLeft = (d - digitsRight).ToString().Count(); 
     int numRight = totalDigits - numLeft; 

     double truncated = d.RoundDown(numRight); 

     string s = truncated.ToString("g15"); 
-2
Alife Goodacre, code is printing "123.12345678901" insted "123.123456789012" 

應該有SUBSTRING(0,16)insted的子串的(0,15)代碼

Convert.ToDouble("123.1234567890129").ToString("G16").Substring(0, 16) 

輸出畫面。

enter image description here

+0

我已經通過這種方式已經修復了我的代碼 –

+0

好,但是當我審查它時,對於15位數字是不正確的。 –

+0

如果double中沒有小數,這將不起作用。 –

0

可以創建自定義FormatProvider,然後創建您的實現。

class Program 
{ 
    static void Main(string[] args) 
    { 
     double number = 123.1234567890129; 

     var result = string.Format(new CustomFormatProvider(15), "{0}", number); 
    } 

} 


public class CustomFormatProvider : IFormatProvider, ICustomFormatter 
{ 
    private readonly int _numberOfDigits; 

    public CustomFormatProvider(int numberOfDigits) 
    { 
     _numberOfDigits = numberOfDigits; 
    } 

    public object GetFormat(Type formatType) => formatType == typeof(ICustomFormatter) ? this : null; 

    public string Format(string format, object arg, IFormatProvider formatProvider) 
    { 
     if (!Equals(formatProvider)) 
      return null; 

     if (!(arg is double)) 
     { 
      return null; 
     } 

     var input = ((double)arg).ToString("R"); 

     return input.Length > _numberOfDigits + 1 ? input.Substring(0, _numberOfDigits + 1) : input; // +1 because of dot 
    } 

可惜你不能這樣做:

var result = number.ToString(new CustomFormatProvider(15)); 

因爲值類型限制..雙只支持CultureInfoNumberFormatInfo格式化。如果通過不同的格式化程序,它將返回默認實例:NumberFormatInfo.CurrentInfo'. You can make small workaround by using string.Format`方法。

0

社區新手。首先在這裏回答。 :)

我認爲你正在尋找這樣的東西。有或沒有小數。這將僅在第15位後刪除數字,而不考慮數字的長度。您可以通過將精度值作爲用戶輸入並相應地執行該條件檢查來讓用戶決定精度。我用了15,因爲你提到它。請讓我知道這對你有沒有用。乾杯!

 string newstr; 
     int strlength,substrval; 
     double number; 
     string strnum = "123.1234567890129"; 
     strlength = strnum.Length; 
     if(strlength>15) 
     { 
      strlength = 15; 
     } 
     substrval = strlength; 
     foreach(char x in strnum) 
     { 
      if(x=='.') 
      { 
       substrval++; 
      } 
     } 
     newstr = strnum.Substring(0, substrval); 
     number=Convert.ToDouble(newstr); 
相關問題