C#将字符串转换为double/decimal并返回字符串,保留尾随零,添加数千的逗号

问题描述:

我想获取用户输入,解析它,然后用String.Format()显示,用逗号格式化数千。C#将字符串转换为double/decimal并返回字符串,保留尾随零,添加数千的逗号

So, if user provides 
1000 I will display 1,000 
1000.00 => 1,000.00 
1000.0 => 1,000.0 
1,000.5 => 1,000.5 

基本上我想保留提供的所有小数(包括尾随零),只是为数千添加格式。 我想:

String.Format("{0:#,0.######}" , Decimal.Parse(input)); 
String.Format("{0:#,0.######}" , Double.Parse(input); 

double.Parse(input)是一个没有去,因为double不跟踪的小数位数的。

decimal.Parse(input).ToString()将显示decimal确实跟踪了这一点。不幸的是,decimal.Parse(input).ToString()使用此精度,不使用千位分隔符,decimal.Parse(input).ToString("N")忽略精度但使用千位分隔符。

手动提取小数精度的作品,虽然,它允许你建立正确的格式字符串:

static string InsertThousandsSeparator(string input) { 
    var dec = decimal.Parse(input); 
    var bits = decimal.GetBits(dec); 
    var prec = bits[3] >> 16 & 255; 
    return dec.ToString("N" + prec); 
} 

这是基于the layout of decimal as described on MSDN

位16至23必须包含0到28之间的指数,其指示10的幂来分割整数。

See it working on .NET Fiddle.(@Alisson提供)

+0

就是这样,所有测试用例都通过了(我自己测试过)。干净整洁的解决方案。 – Alisson

+0

非常好。非常感谢。我想我需要写一些正则表达式,我真的很想避免。 – Razkar

如果你不介意的1000转换为1,000.00然后下面是最好的,因为它认为用户的区域了。

string output = String.Format("{0:n}", input); 

如果你想在1000转换只是1000,那么你可以使用以下命令:

string output2 = String.Format("{0:#,##0.##}", input); 
+0

“如果您不介意1000转换为1,000.00” - 如果您不介意忽略问题中的内容,任何答案都可以使用,但问题明确涵盖了这一点。 – hvd

+0

这不是OP要求的。他们希望保持相同的小数位数。 – Alisson

+0

如果没有正确阅读问题,就表示同意,不好回答。我的错。 – Sach

您可以使用正则表达式是:

var input = "1000.50000"; 
var regex = new Regex("^(?<int>-?[\\d,]+)\\.(?<fract>\\d+)$"); 
var match = regex.Match(input); 
var integralPart = match.Groups["int"].Value.Replace(",", ""); 
var fractionalPart = match.Groups["fract"].Value; 
var result = $"{decimal.Parse(integralPart):n0}.{fractionalPart}"; 

 public string DoFormat(string num) 
    { 
     int pt = num.IndexOf("."); 
     if (pt > 0) 
     { 
      return string.Format("{0:#,##0}", num.Substring(0, pt)) + num.Substring(pt, num.Length - pt); 
     } 
     else 
     { 
      return string.Format("{0:#,##0}", num); 
     } 
    } 

此拆分字符串在小数点处,并返回小数点后的所有内容,如在BUT中键入的那样格式化数字的整数部分用逗号。