如何将带有尾随零的字符串转换为十进制数

5
假设我们有一个 stringvalue=125.32600,使用以下代码将其转换为十进制值:
decimal d;
decimal.tryparse(stringvalue,out d)

d值是125.326,我该如何进行转换以得到最终结果 125.32600。

5个回答

8

你不能这样做,因为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));

是的,没错。但是末尾零的数量取决于用户定义的设置。我认为我必须将小数点数字存储为一个选项。 - Omital
1
所以你可以有一个precision变量,并根据你的需求来格式化你的值。 - Zbigniew
@walkhard:因为"f5"只适用于特定的值;没有尝试提供通用解决方案。(顺便说一句,结果证明你的答案和我的一样有缺陷 :)) - Erik Kaplun
@ErikAllik并没有请求这样的东西,而且OP可以很容易地根据需要重写它,但既然你提到了它,我已经更新了我的答案,加入了通用解决方案。 - Zbigniew
@walkhard:我知道这并不是要求,但根据我的经验,仅仅得到一个特殊情况的解决方案对任何人来说都几乎没有太大用处。 - Erik Kaplun
显示剩余3条评论

3
您的代码已按原样工作(只要小数分隔符与您的文化相匹配):
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


2
答案是:你不能这样做。至少不是那样做。
编辑:更正:`decimal` 已经可以像那样工作了;但你仍然可以在下面找到一种有用的方法来存储你的小数在数据库中。
为什么?因为小数不是这样存储在内存中的。
解决方案:如果你需要保留尾随的零,只需在一个单独的字段(你应该为此目的创建一个类)中显式地记住精度;或者将小数以字符串形式存储,并且只在需要时转换为 `decimal`。
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));

注意: 在需要使用逗号而不是点号的语言环境中,请务必使用,


谢谢您的回复。但是我想将用户输入值及其尾随零存储到数据库中,您有什么解决方案吗? - Omital
@user2377017:我已经修改了我的答案并添加了必要的细节。 - Erik Kaplun
@ErikAllik 楼主没有提到任何数据库。 - CodesInChaos
@CodesInChaos:但是他在这个答案的第一个评论中确实这样做了。 - Erik Kaplun
那么这仍然取决于数据库,所以这不再是一个C#问题了。 - CodesInChaos
显示剩余4条评论

1
你可以对字符串中的“零”进行计数,然后将其存储在单独的数据库字段中。当您需要带有“零”的结果时,只需将相同数量的“零”连接到“十进制数字字符串”中即可。
例如:
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

0

如果你真的想在数据库中保存零,你可以将其保存为预格式化的字符串,但这样非常低效。

你试图解决什么问题?也许有更好的解决方案?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接