2012-05-02 50 views
2

設立一個特定的toString我希望做一個客戶十進制格式。我現在得到的是「(3003.3003d).ToString(#,###。00 ##」)是「3,003.3003」。我試圖獲得的格式是「3,003.300,3」。C#文化信息/貨幣

我可以使用客戶的方法,math.floor並打破它除了我自己,但我很好奇,如果有使用文化信息做什麼,我在尋找一種方式。任何人都知道有辦法做到這一點?

寫了自定義的IFormatProvider的傢伙作爲答案的教程很不錯,但我不相信當前的文化與我需要的東西存在。這是我的最終答案:

private string ToCustomDecimal(decimal Input, int MaxLenPostDec, int MinLenPostDec) 
    { 
     string CustD; 
     string[] Split = Input.ToString().Split('.'); 
     string BigNum = Split[0]; 
     string SmallNum = "0"; 
     if (Split.Length > 1) 
      SmallNum = Split[1]; 
     int Spot = 0; 
     bool FirstD = false; 
     string OutBigNum = ""; 
     for (int Locc = BigNum.Length - 1; Locc >= 0; Locc--) 
     { 
      Spot++; 
      if (FirstD == false) 
      { 
       OutBigNum = BigNum.Substring(Locc, 1) + OutBigNum; 
       FirstD = true; 
      } 
      else 
       OutBigNum = (Spot % 3 == 1 ? "'" : "") + BigNum.Substring(Locc, 1) + OutBigNum; 
     } 
     Spot = 0; 
     FirstD = false; 
     string OutSmallNum = ""; 
     for (int Locc = 0; Locc < SmallNum.Length; Locc++) 
     { 
      Spot++; 
      if (FirstD == false) 
      { 
       OutSmallNum += SmallNum.Substring(Locc, 1); 
       FirstD = true; 
      } 
      else 
      { 
       OutSmallNum += (Spot % 3 == 1 ? "," : "") + SmallNum.Substring(Locc, 1); 
      } 
      if (Locc >= MaxLenPostDec - 1) 
       break; 
      if (Locc == SmallNum.Length - 1 && MinLenPostDec > Locc) 
      { 
       for (int Locc2 = Locc; Locc2 < MinLenPostDec - 1; Locc2++) 
       { 
        Spot++; 
        OutSmallNum += (Spot % 3 == 1 ? "," : "") + 0; 
       } 
      } 
     } 
     CustD = OutBigNum + "." + OutSmallNum; 
     return CustD; 
    } 
+0

我懷疑你沒有使用正確的數據類型(十進制)任何你正在努力實現。 –

+0

我會用自定義的IFormatprovider作爲答案寫下這個人,儘管它不是我想要的。 要達林,我在我的最後的例子和小數用雙(3000D)。我最終創建了我自己的方法,發佈如下,因爲我無法想象當前的文化會解析我的需求並廣泛地應對任何問題。 – Charles

回答

3

你應該尋找到超載ToString("#,###.00##", myFormatProvider)

所以你需要一個custom IFormatprovider

1

這看起來好像會起作用,但我沒有測試它。

(3003.3003d).ToString(@"#\'###.00#\,##") 
+0

實際上這將是'(3003.3003d)的ToString(@ 「#\ '###。00#',」##「)'。你必須逃避'''和',' –

+0

謝謝@JimSchubert,改變了。 – Hogan

+0

沒問題。你仍然需要'@'來啓動字符串,否則'\,'是一個無法識別的轉義。 :P –

0

看一看Decimal.ToString超載與IFromatProvider。我想你要麼用特定的(CultureInfo.CreateSpecificCulture())或當前的文化(CultureInfo.CurrentCulture)向用戶顯示貨幣。