假设我们有一个
stringvalue=125.32600
,使用以下代码将其转换为十进制值:decimal d;
decimal.tryparse(stringvalue,out d)
d值是125.326,我该如何进行转换以得到最终结果 125.32600。
stringvalue=125.32600
,使用以下代码将其转换为十进制值:decimal d;
decimal.tryparse(stringvalue,out d)
d值是125.326,我该如何进行转换以得到最终结果 125.32600。
你不能这样做,因为125.32600
等于125.326
。但如果你想以特定的格式输出它,可以这样做:
Console.WriteLine(d.ToString("f5"));
请查阅标准数值格式字符串
更新
扩展方法:
public string Format(this decimal source, int precision)
{
if (precision < 0)
{
throw new ArgumentOutOfRangeException("Precision must be a non negative integer");
}
return source.ToString("f" + precision);
}
Console.WriteLine(d.Format(5));
decimal d;
decimal.TryParse("125.32600", NumberStyles.Number, CultureInfo.InvariantCulture, out d);
s = d.ToString(CultureInfo.InvariantCulture); // 125.32600
< p > Decimal
已经记住了它有多少个尾随零。这是由于decimal
以非规范化形式表示数字,具有整数尾数和表示十进制数字数量的指数引起的。例如,125.32600
表示为12532600 * 10^-5
。
string strValue = "125.32600";
int precision = strValue.Length - 1; // only the "12332600" part
decimal value = Decimal.Parse(strValue);
将8
存储在precision
中,将125.326
存储在value
中。
要恢复原始格式:
int afterPt = precision - ((int) value).ToString().Length;
Console.WriteLine(value.ToString("f" + afterPt));
打印
125.32600
提示:在使用浮点数时需要注意它的二进制表示问题,例如4.05
可能会被存储为4.049999999999999999
。如果您需要确保这种情况不会发生,可以使用一种算法,绕过decimal
并且仅使用整数进行存储和计算。
string strValue = "125.32600";
// parse and store
int value = int.Parse(strValue.Replace(".", ""));
int periodIx = strValue.IndexOf(".");
// get back the original representation
string str = value.ToString();
Console.WriteLine(str.Substring(0, periodIx) + "." + str.Substring(periodIx, str.Length - periodIx));
注意: 在需要使用逗号而不是点号的语言环境中,请务必使用,
。
string p="123.456000";
int zeroes=p.Split('0').Length - 1; // guess
decimal value = Decimal.Parse(p); //without zeroes
string valWithZero=value.toString().padRight(zeroes,'0'); //with zeroes
如果你真的想在数据库中保存零,你可以将其保存为预格式化的字符串,但这样非常低效。
你试图解决什么问题?也许有更好的解决方案?
precision
变量,并根据你的需求来格式化你的值。 - Zbigniew"f5"
只适用于特定的值;没有尝试提供通用解决方案。(顺便说一句,结果证明你的答案和我的一样有缺陷 :)) - Erik Kaplun