2014-10-05 57 views
0

我想知道格式化数字的最佳方式是什么,以便NumberGroupSeparator不仅可以在逗号左侧的整数部分上工作,还可以在右侧的小数部分上工作的逗号。小数部分的小数群组分隔符

Math.PI.ToString("###,###,##0.0##,###,###,###") // As documented .. 
               // ..this doesn't work 
3.14159265358979        // result 
3.141,592,653,589,79       // desired result 

至于在案MSDNNumberGroupSeparator作品只有逗号的左侧。我想知道为什么??

+0

,因为它是无效的。他们不会以同样的方式分组(数千人,数十人,数百人),除非第一组是两项:'3.14,159,265,358,979' – Plutonix 2014-10-05 12:23:46

+0

咦?显然需要从逗号开始,十分之一,百分之一和千分之一会成为一个完美的正常组!这不是关于什么 - 它是关于可读性的! – TaW 2014-10-05 12:24:50

+2

@TaW有点主观,但它对我来说不可读。数字组逗号提示它是一个很大的数字(数千亿或者某个东西),直到你找到点,这看起来很奇怪。这不是一种常用的格式,这可能是它不起作用的原因。在你提出问题之前,我不会猜想有人会想这样来格式化他们的数字。 – BartoszKP 2014-10-05 12:45:19

回答

0

好吧,不是我强大的一面,但我猜这可能是我最好的选择:

string input = Math.PI.ToString(); 
string decSeparator = System.Threading.Thread.CurrentThread 
         .CurrentCulture.NumberFormat.NumberGroupSeparator; 
Regex RX = new Regex(@"([0-9]{3})"); 
string result = RX.Replace(input , @"$1" + decSeparator); 

谢谢您听..

0

有点麻烦,而且它不会为科学数字工作,但这里是一个尝试:

class Program 
{ 
    static void Main(string[] args) 
    { 
     var π=Math.PI*10000; 

     Debug.WriteLine(Display(π)); 
     // 31,415.926,535,897,931,899 
    } 

    static string Display(double x) 
    { 
     int s=Math.Sign(x); 
     x=Math.Abs(x); 
     StringBuilder text=new StringBuilder(); 
     var y=Math.Truncate(x); 
     text.Append((s*y).ToString("#,#")); 
     x-=y; 
     if (x>0) 
     { 
      // 15 decimal places is max reasonable precision 
      y=Math.Truncate(x*Math.Pow(10, 15)); 
      text.Append("."); 
      text.Append(y.ToString("#,#").TrimEnd('0')); 
     } 
     return text.ToString(); 
    } 

} 
0

它可能是最好与你的.ToString()生成的字符串工作:

class Program 
{ 
    static string InsertSeparators(string s) 
    { 
     string decSeparator = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberDecimalSeparator; 

     int separatorPos = s.IndexOf(decSeparator); 
     if (separatorPos >= 0) 
     { 
      string decPart = s.Substring(separatorPos + decSeparator.Length); 
      // split the string into parts of 3 or less characters 
      List<String> parts = new List<String>(); 
      for (int i = 0; i < decPart.Length; i += 3) 
      { 
       string part = ""; 
       for (int j = 0; (j < 3) && (i + j < decPart.Length); j++) 
       { 
        part += decPart[i + j]; 
       } 
       parts.Add(part); 
      } 
      string groupSeparator = System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.NumberGroupSeparator; 
      s = s.Substring(0, separatorPos) + decSeparator + String.Join(groupSeparator, parts); 
     } 

     return s; 

    } 

    static void Main(string[] args) 
    { 

     for (int n = 0; n < 15; n++) 
     { 
      string s = Math.PI.ToString("0." + new string('#', n)); 
      Console.WriteLine(InsertSeparators(s)); 
     } 

     Console.ReadLine(); 

    } 
} 

输出:

3 
3.1 
3.14 
3.142 
3.141,6 
3.141,59 
3.141,593 
3.141,592,7 
3.141,592,65 
3.141,592,654 
3.141,592,653,6 
3.141,592,653,59 
3.141,592,653,59 
3.141,592,653,589,8 
3.141,592,653,589,79