Mik*_*oud 47 .net c# type-conversion
排序string
是显示这样的货币数据$1,995.94
数值在一组数据.
我目前正在使用下面的代码示例将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);
}
Run Code Online (Sandbox Code Playgroud)
有什么更好的方法呢?它有效,而且很酷,但它不是很优雅.
Servy提供的答案按预期工作,我使用了一段时间的实现,但是我和一位同事找到了更好的方法,所以我在这里记录它.顺便说一句,我最终最终使用了这个解决方案.
decimal.Parse(input, NumberStyles.AllowCurrencySymbol | NumberStyles.Number);
Run Code Online (Sandbox Code Playgroud)
bon*_*igo 26
怎么样,但只适用于一个字符串值.所以,你需要得到您的字符串split
通过$
,然后进行转换,同时节省成array
或list
using System.Globalization;
//rest of your code
string str = "$50,550.20";
decimal decval;
bool convt = decimal.TryParse(str, NumberStyles.Currency,
CultureInfo.CurrentCulture.NumberFormat, out decval);
if (convt)
Console.WriteLine(decval);
Console.ReadLine();
Run Code Online (Sandbox Code Playgroud)
Ser*_*rvy 12
这是一种与您提供的代码最相似的方法
public static decimal Parse(string input)
{
return decimal.Parse(Regex.Replace(input, @"[^\d.]", ""));
}
Run Code Online (Sandbox Code Playgroud)
这是一个支持负数的选项,如果找到第二个句点值,它将停止,从而减少它返回的非有效值的字符串数decimal
.它还有一些在OP中没有看到的其他修改,以处理当前代码没有的其他情况.
public static decimal Parse(string input)
{
return decimal.Parse(Regex.Match(input, @"-?\d{1,3}(,\d{3})*(\.\d+)?").Value);
}
Run Code Online (Sandbox Code Playgroud)
decimal amount = decimal.Parse("$123,456.78",
NumberStyles.AllowCurrencySymbol |
NumberStyles.AllowThousands |
NumberStyles.AllowDecimalPoint);
Run Code Online (Sandbox Code Playgroud)
这是一个更简单的解决方案:
public static decimal ToDecimal(this string str)
{
return decimal.Parse(str, NumberStyles.Currency);
}
Run Code Online (Sandbox Code Playgroud)
和单元测试:
[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, "$1,234.56".ToDecimal());
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
44445 次 |
最近记录: |