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

时间:2017-07-26 16:48:55

标签: c# type-conversion double decimal trailing

我正在尝试获取用户输入,解析它然后使用String.Format()显示,使用coma格式化数千个。

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);

4 个答案:

答案 0 :(得分:7)

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提供)

答案 1 :(得分:0)

您可以使用正则表达式:

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}";

答案 2 :(得分:0)

        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中输入的格式是用逗号格式化数字的整数部分。

答案 3 :(得分:-1)

如果你不介意1000转换为1,000.00,那么跟随是最好的,因为它也考虑用户的语言环境。

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

如果您希望1000转换为1,000,那么您可以使用以下内容:

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