将任何货币字符串转换为double

Jam*_*mes 40 c# currency cultureinfo

我需要在SQL服务器中存储多种货币.我知道SQL不支持所有不同类型的货币(除非我将其存储为字符串,但我不想这样做).

我的想法是将所有值从他们的货币格式转换为标准的双倍并存储它.然后在显示时根据文化信息重新格式化.但是,我尝试过做类似的事情

var cultureInfo = new System.Globalization.CultureInfo("en-US");
double plain = return Double.Parse("$20,000.00", cultureInfo);
Run Code Online (Sandbox Code Playgroud)

这似乎永远不会工作它总是抛出一个FormatException.即使删除货币符号,只是尝试根据数字单独执行此操作也会做同样的事情.这只是一个例子,我想支持几乎任何类型的货币.

是否有一种标准的方式来剥离货币并将价值变为双倍?

Han*_*son 97

我认为这应该有效:

double.Parse(currencyValue, NumberStyles.Currency);
Run Code Online (Sandbox Code Playgroud)

在这里,您可以看到有关NumberStyles的更多信息.

编辑:如果有人在没有查看其他答案/评论的情况下看到这个答案,这个答案回答了所写的问题,但将货币存储double为不是一个好主意,最好使用十进制代替.

  • 是的,或者给定文化的`double.Parse(currencyValue,NumberStyles.Currency,cultureInfo`). (6认同)
  • 我在Unversal App中使用它:双倍金钱; if(double.TryParse(currencyValue,NumberStyles.Currency,System.Globalization.CultureInfo.CurrentCulture,out money)){} (3认同)
  • 不是理想的解决方案,如果当前的语言环境是en-US,则不会解析井号(例如) (2认同)
  • 我不明白这如何回答这个问题。“double.Parse”(或“decimal.Parse”)如何解析包含任何货币符号的字符串?这可以是“$”、“$”、“€”或其他。目前您只是解析当前文化的货币符号。但即使你通过了另一项,你也只会允许那一项。你怎么能允许任何可能的文化/货币?这就是我对这个问题的理解 (2认同)

Chr*_*lor 21

您应该将NumberStyles传递给Parse函数

Decimal.Parse("$20,000.00", NumberStyles.AllowCurrencySymbol | NumberStyles.AllowDecimalPoint | NumberStyles.AllowThousands, new CultureInfo("en-US"));
Run Code Online (Sandbox Code Playgroud)

其他一些东西,对于货币,我建议你使用十进制.这可能会有所不同,但最好将货币数据存储为数据库中的Money,并添加货币代码以识别值的货币.

是的,答案建议使用NumberStyles.Currency会更好.如果您仍然认为要使用字符串,那么这是一个预先定义的值.