我有一个返回double值的函数。
如何取整数部分加小数部分,但如果它在第四个小数位后面,则删除右边的零和另一个数字?
21.879653 // 21.8796
21.000000 // 21
21.020000 // 21.02
我尝试使用正则表达式:
Regex.Replace(
Regex.Match(result.ToString(), @"^\d+(?:\.\d{4})?").Value,
@"0*$", "");
但我没有运气......而且我确定这不是正则表达式的任务。
其他想法?
答案 0 :(得分:3)
您可以使用标准.NET Numeric Format Strings:
,而不是icky字符串操作<强> “#”强>
数字占位符
将“#”符号替换为相应的数字(如果存在);否则,结果字符串中不会出现数字。
pwd
https://dotnetfiddle.net/n9xrfU
小数点前的格式说明符为#0,表示将显示至少一个数字。
答案 1 :(得分:0)
您可以使用Math.Truncate删除不需要的数字。如果您只想要4位数字:
double d = 21.879653;
double d2 = Math.Truncate(d * 10000) / 10000;
Console.WriteLine(d2.ToString("#.####"));
答案 2 :(得分:0)
试试这个。它没有写任何零。
internal class Program
{
static void Main()
{
double d = 21.8786;
double d1 = 21.000;
double d2 = 21.02000;
double d3 = 0;
WriteNameAndValue(nameof(d), d.FormatDoubleToFourPlaces());
WriteNameAndValue(nameof(d1), d1.FormatDoubleToFourPlaces());
WriteNameAndValue(nameof(d2), d2.FormatDoubleToFourPlaces());
WriteNameAndValue(nameof(d3), d3.FormatDoubleToFourPlaces());
}
static void WriteNameAndValue(string name, string value)
{
Console.WriteLine($"Name: {name}\tValue: {value}");
}
}
static class DoubleHelper
{
public static string FormatDoubleToFourPlaces(this double d, CultureInfo ci = null)
{
const int decimalPlaces = 4;
if (double.IsInfinity(d) || double.IsNaN(d))
{
var ex = new ArgumentOutOfRangeException(nameof(d), d, "Must not be NaN or infinity");
throw ex;
}
decimal decimalVersion = Convert.ToDecimal(d);
if (decimalVersion == 0)
{
return string.Empty;
}
int integerVersion = Convert.ToInt32(Math.Truncate(decimalVersion));
if (integerVersion == decimalVersion)
{
return integerVersion.ToString();
}
decimal scaleFactor = Convert.ToDecimal(Math.Pow(10.0, decimalPlaces));
decimal scaledUp = decimalVersion*scaleFactor;
decimal truncatedScaledUp = Math.Truncate(scaledUp);
decimal resultingVersion = truncatedScaledUp/scaleFactor;
return resultingVersion.ToString(ci ?? CultureInfo.InvariantCulture);
}
}