C# 将字符串转换为双精度/十进制并返回字符串,保留尾随零,为千位添加逗号

Posted

技术标签:

【中文标题】C# 将字符串转换为双精度/十进制并返回字符串,保留尾随零,为千位添加逗号【英文标题】:C# Convert string to double/decimal and back to string, keeping trailing zeroes, adding comas for thousands 【发布时间】:2018-01-02 03:14:21 【问题描述】:

我正在尝试获取用户输入,对其进行解析,然后用 String.Format() 显示,用逗号格式化数千个。

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

就是这样,所有测试用例都通过了(我自己测试过)。干净整洁的解决方案。 优秀。非常感谢。我在想我需要写一些正则表达式,我真的很想避免。【参考方案2】:

如果您不介意将 1000 转换为 1,000.00,那么以下是最好的,因为它也考虑了用户的语言环境。

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

如果您想将 1000 转换为仅 1,000,则可以使用以下方法:

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

【讨论】:

"如果您不介意将 1000 转换为 1,000.00" -- 如果您不介意忽略问题中的内容,任何答案都有效,但问题具体涵盖了这一点。 这不是 OP 要求的。他们希望保留相同的小数位数。 同意,没有正确阅读问题的错误答案。我的错。【参考方案3】:

您可以为此使用正则表达式:

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

【讨论】:

【参考方案4】:
        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);
        
    

这会在小数点处拆分字符串并返回小数点后的任何内容

【讨论】:

以上是关于C# 将字符串转换为双精度/十进制并返回字符串,保留尾随零,为千位添加逗号的主要内容,如果未能解决你的问题,请参考以下文章

在 C# 中将十进制数转换为双精度数会产生差异

Ruby 将 64 位 IEEE 754 十六进制转换为双精度

将字符串转换为双精度的最佳方法

在 C# 中将字符串转换为双精度

在java中将十六进制数字字符串转换为双精度数字

C++ 将字符串转换为双精度