在C#中将字符串转换为十进制数

3

我在使用decimal.parse将字符串转换为十进制值时遇到了一些问题。以下是我的代码行:

fixPrice = decimal.Parse(mItemParts.Groups["price"].Value.Replace("$", "").Replace(" ", "").Replace("usd", ""));     

我试图转换的值是: '$779.99'。
然后一旦解析为十进制,我得到这个值: 77999。
我想要得到的是779.99而不是77999。 提前感谢,Laziale。
正则表达式包括:@"\[^\""]+?)\""[^~]+?\]+?src=\""(?[^\""]+?)\""[^>]+?title=\""(?[^\""]+?)\""[^~]+?price\"">(?[^\<]+?)\<[^~]+?\(?[^\<]+?)\

看起来你正在使用正则表达式获取价格,你使用的是什么表达式? - CraigW
@CraigW 包括正则表达式。我从正则表达式得到的最终产品是 $779.99。 - Laziale
4个回答

6

我会使用Decimal.TryParse()

decimal parsedDecimal = 0;
string yourCurrency = "$779.99";
bool didParse = Decimal.TryParse(yourCurrency,
                                 NumberStyles.Currency,
                                 new CultureInfo("en-US"), out parsedDecimal);

if(didParse) {
    // Parse succeeded
}
else {
    // Parse failed
}

2
CurrentCulture 不一定是最佳选择。 - Odys
1
你应该检查 TryParse 的布尔返回值,以查看解析是否成功。 - Steve Wong
@评论者们,有时候我想把一个快速而简单的示例作为答案放进去,但是我记得这里是SO :). 我已经更新了我的答案以反映你们的建议。 - James Hill
1
但这并没有帮助到原帖作者,因为(1)他知道输入字符串是有效的,而且(2)有一个成功的解析,但返回了错误的值。 - phoog
@JamesHill:别担心,你还有我的支持 :)。如果我再挑剔一下的话,你的注释是错误的 :)。 - Steve Wong
@SteveWong,哈哈。在我编辑答案之前它们不是那样的:)。我需要停止同时进行多个任务。显然,我做得很糟糕! - James Hill

3

看起来你正在一个小数点为“.”,千位分隔符为“,”的文化环境中运行。为了解决这个问题,请使用带有CultureInfo参数的Parse重载函数:

fixPrice = decimal.Parse(stringExpression, CultureInfo.InvariantCulture);

此外,还应查看NumberStyles枚举,这样您就不必自己担心货币符号:
fixPrice = decimal.Parse(stringExpression, NumberStyles.Currency, new CultureInfo("en-US"));

通过这种方式,确保字符串格式始终正确。那么 TryParse 呢? - Pankaj
当然,如果OP不确定输入是否有效,那么TryParse更可取。 - phoog
根据LINQPad的显示,这些示例都无法工作 - FormatException - 输入字符串格式不正确 - James Hill
@JamesHill 第一个示例应该与“779.99”一起使用(如OP的示例),对我来说,它确实有效。我已经纠正了第二个示例(InvariantCulture不使用“$”作为货币符号);感谢指出错误。 - phoog

2

传递一个CultureInfo实例,该实例来自您正在解析的文化中。

CultureInfo继承自IFormatProvider

编辑:

以下是转换示例

Decimal.Parse(yourValue, NumberStyles.AllowCurrencySymbol |
                         NumberStyles.AllowDecimalPoint   |
                         NumberStyles.AllowThousands,
              CultureInfo.InvariantCulture);

1
该值显然是货币价值;十进制是更合适的类型。 - phoog
经常发生需要解析超过5位数值的情况。 - Odys
@odyodyodys 十进制具有比双精度更高的精度。 - phoog

1
这对我来说有效:
string decStr = "$779.99";
CultureInfo ci = new CultureInfo("en-US");
decimal fixPrice = decimal.Parse(decStr, NumberStyles.Currency, ci);

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