C# 将字符串转换为 double/decimal 并返回字符串,保留尾随零,为千位添加逗号
C# Convert string to double/decimal and back to string, keeping trailing zeroes, adding comas for thousands
我正在尝试获取用户输入,对其进行解析,然后用 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);
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:
Bits 16 to 23 must contain an exponent between 0 and 28, which indicates the power of 10 to divide the integer number.
See it working on .NET Fiddle.(由@Alisson 提供)
如果您不介意将 1000 转换为 1,000.00,那么以下是最好的,因为它也考虑了用户的区域设置。
string output = String.Format("{0:n}", input);
如果您想将 1000 转换为 1,000,则可以使用以下方法:
string output2 = String.Format("{0:#,##0.##}", input);
您可以为此使用正则表达式:
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);
}
}
这会在小数点处拆分字符串,returns 在 BUT 中键入的小数点后的任何内容都会用逗号格式化数字的整数部分。
我正在尝试获取用户输入,对其进行解析,然后用 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);
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:
Bits 16 to 23 must contain an exponent between 0 and 28, which indicates the power of 10 to divide the integer number.
See it working on .NET Fiddle.(由@Alisson 提供)
如果您不介意将 1000 转换为 1,000.00,那么以下是最好的,因为它也考虑了用户的区域设置。
string output = String.Format("{0:n}", input);
如果您想将 1000 转换为 1,000,则可以使用以下方法:
string output2 = String.Format("{0:#,##0.##}", input);
您可以为此使用正则表达式:
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);
}
}
这会在小数点处拆分字符串,returns 在 BUT 中键入的小数点后的任何内容都会用逗号格式化数字的整数部分。