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# 将字符串转换为双精度/十进制并返回字符串,保留尾随零,为千位添加逗号的主要内容,如果未能解决你的问题,请参考以下文章