将请求的查询字符串转换为十进制数

3

我无法将查询字符串转换为十进制数。

在这个例子中,当我控制Request.QueryString["Amount"]的值时,它是32.52。在下面的代码工作之后,Amount的值变成了3252M之类的东西。我该怎么轻松地解决这个问题呢?

decimal Amount= 0;
if (Request.QueryString["Amount"] != null)
     Amount = Convert.ToDecimal(Request.QueryString["Amount"]);

这里涉及到了“债务”,你确定要使用“decimal”吗? - Octopoid
你是否遇到了“FormatException”? - Soner Gönül
记住,创建一个字面量数字decimal的速记方式是1234m。这就是为什么你会在末尾看到M。我假设你当前的文化使用.作为分组分隔符(而不是小数分隔符),这就是为什么32.52变成了3252m的原因。 - Octopoid
@SonerGönül 不,我没有。它将值3252转换了。 - baros
2个回答

5

Convert.ToDecimal 默认使用当前语言环境设置。

强烈怀疑你的CurrentCultureNumberDecimalSeparator 属性不是 .,而是 NumberGroupSeparator 属性.

这就是为什么你的程序认为这是千分位分隔符,而不是小数点分隔符,并将其解析为 3252 而不是 32.52.

作为解决方案,你可以使用具有 . 作为 NumberDecimalSeparator 的语言环境,如 InvariantCulture,或者你可以.Clone当前语言环境并将其 NumberDecimalSeparator 设置为.1

Amount = Convert.ToDecimal(Request.QueryString["Amount"], CultureInfo.InvariantCulture);

或者

var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = ".";
culture.NumberFormat.NumberGroupSeparator = ",";
Amount = Convert.ToDecimal("32.52", culture);

1: 如果您当前的区域设置中千位分隔符不是.,那么您也需要进行更改。对于任何区域设置,这两个属性都不能具有相同的值。


0

我认为你在上一个答案中提到的文化方面遇到了问题。你可以尝试使用不同的文化:

RetVal = decimal.Parse(Request.QueryString["Amount"], CultureInfo.CurrentCulture);

那么我会尝试:

RetVal = decimal.Parse(Request.QueryString["Amount"], CultureInfo.InvariantCulture);

1
Soner之前的回答更加详细。 - Miquel Coll

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