C# 将货币字符串转换为十进制?
声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow
原文地址: http://stackoverflow.com/questions/14162357/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me):
StackOverFlow
Convert currency string to decimal?
提问by Mike Perrenoud
Objective
客观的
Sort a string
that is displaying currency data like this $1,995.94
numerically in a set of data.
对一组数据中以数字string
方式显示货币数据的a进行排序$1,995.94
。
Code
代码
I'm currently using the below code sample to convert the string
value to decimal
so that I can sort it properly.
我目前正在使用下面的代码示例将string
值转换为,decimal
以便我可以对其进行正确排序。
if (sortBy == "checkAmount")
{
StringBuilder sb = new StringBuilder();
foreach (var c in Convert.ToString(p.GetType().GetProperty(sortBy).GetValue(p, null)))
{
if (!char.IsDigit(c) && c != '.') { continue; }
sb.Append(c);
}
return Convert.ToDecimal(sb.ToString());
}
else
{
return p.GetType().GetProperty(sortBy).GetValue(p, null);
}
Problem
问题
What's a better way of doing this? It works, and that's cool, but it's not very elegant.
这样做的更好方法是什么?它有效,这很酷,但它不是很优雅。
Final Solution
最终解决方案
The answer provided by Servyworks as expected, and I used that implementation for a while, but a colleague and I found an even better way so I'm documenting it here. BTW, I ended up using this solution in the end.
Servy 提供的答案按预期工作,我使用了该实现一段时间,但我和一位同事找到了更好的方法,因此我将其记录在此。顺便说一句,我最终使用了这个解决方案。
decimal.Parse(input, NumberStyles.AllowCurrencySymbol | NumberStyles.Number);
采纳答案by Servy
Here is a method that most closely resembles the code you've provided
这是一种与您提供的代码最相似的方法
public static decimal Parse(string input)
{
return decimal.Parse(Regex.Replace(input, @"[^\d.]", ""));
}
Here is an option that will support negative numbers, and will stop if it finds a second period value, thus reducing the number of strings it returns that are not valid decimal
values. It also has a few other modifications not seen in the OP to handle additional cases your current code doesn't.
这是一个支持负数的选项,如果找到第二个周期值,它将停止,从而减少它返回的无效decimal
值字符串的数量。它还有一些在 OP 中没有看到的其他修改,以处理您当前代码没有的其他情况。
public static decimal Parse(string input)
{
return decimal.Parse(Regex.Match(input, @"-?\d{1,3}(,\d{3})*(\.\d+)?").Value);
}
回答by bonCodigo
How about this, but only works for one string value. So you need to get your string split
by $
and then do the conversion while saving into the array
or list
这个怎么样,但只适用于一个字符串值。所以,你需要得到您的字符串split
通过$
,然后进行转换,同时节省成array
或list
using System.Globalization;
//rest of your code
string str = ",550.20";
decimal decval;
bool convt = decimal.TryParse(str, NumberStyles.Currency,
CultureInfo.CurrentCulture.NumberFormat, out decval);
if (convt)
Console.WriteLine(decval);
Console.ReadLine();
回答by Richard
public static decimal ToDecimalFromStringDecimalOrMoneyFormattedDecimal(this string s)
{
try
{
return decimal.Parse(s);
}
catch
{
var numberWithoutMoneyFormatting = Regex.Replace(s, @"[^\d.-]", "");
return decimal.Parse(numberWithoutMoneyFormatting);
}
}
[Test]
public void Test_ToDecimalFromStringDecimalOrMoneyFormattedDecimal()
{
Assert.That("$ 500".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)500);
Assert.That("R -500".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)-500);
Assert.That("-$ 500".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)-500);
Assert.That("P 500.90".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)500.9);
Assert.That("$ -50 0,090,08.08".ToDecimalFromStringDecimalOrMoneyFormattedDecimal() == (decimal)-50009008.08);
}
回答by bilal
decimal amount = decimal.Parse("3,456.78",
NumberStyles.AllowCurrencySymbol |
NumberStyles.AllowThousands |
NumberStyles.AllowDecimalPoint);
回答by Red
Here is a simpler solution:
这是一个更简单的解决方案:
public static decimal ToDecimal(this string str)
{
return decimal.Parse(str, NumberStyles.Currency);
}
and the unit test:
和单元测试:
[Test]
public void ToDecimal_Convert_String_To_Decimal()
{
Assert.AreEqual(1234M, "1234".ToDecimal());
Assert.AreEqual(-1234.56M, "$(1,234.56)".ToDecimal());
Assert.AreEqual(1234.56M, ",234.56".ToDecimal());
}
回答by robert
works for all culture:
适用于所有文化:
var d = decimal.Parse("7.7", NumberStyles.Currency, CultureInfo.CreateSpecificCulture("us-US").NumberFormat);
Console.WriteLine(d);