.net 将字符串解析为可空的数值类型(1或2行)

xqkwcwgp  于 2023-06-07  发布在  .NET
关注(0)|答案(8)|浏览(506)

场景

将字符串分析为可为空的数值类型。如果解析不成功,则结果应为空;否则,结果应该是解析的值。

问题

为了做到这一点,我总是使用以下简单但冗长的方法:

string numericString = "...";

decimal? numericValue;
decimal temp;
if (decimal.TryParse(numericString, out temp))
{
    numericValue = temp;
}
else
{
    numericValue = null;
}

我使用上面的方法是因为下面的代码编译不了

decimal temp;
decimal? numericValue = decimal.TryParse(numericString, out temp) ? temp : null;

有没有人知道第一段代码的版本和第二段代码一样简短、整洁和可读?我知道我总是可以编写一个扩展方法来封装第一段代码,但我想知道是否有任何方法可以在没有扩展方法的情况下完成我想要的任务。

a64a0gku

a64a0gku1#

一个简单的显式类型转换使其可编译:

decimal temp;
// typecast either 'temp' or 'null'
decimal? numericValue =
  decimal.TryParse(numericString, out temp) ? temp : (decimal?)null;

另一种选择是在所需的可空类型上使用default运算符:

decimal temp;
// replace null with default
decimal? numericValue =
  decimal.TryParse(numericString, out temp) ? temp : default(decimal?);
bf1o4zei

bf1o4zei2#

我会这么做

public delegate bool TryParseDelegate<T>(string str, out T value);

public static T? TryParseOrNull<T>(TryParseDelegate<T> parse, string str) where T : struct
{
    T value;
    return parse(str, out value) ? value : (T?)null;
}

decimal? numericValue = TryParseOrNull<decimal>(decimal.TryParse, numericString);

或者你可以把它变成一个扩展方法:

public static T? TryParseAs<T>(this string str, TryParseDelegate<T> parse) where T : struct
{
    T value;
    return parse(str, out value) ? value : (T?)null;
}

decimal? numericValue = numericString.TryParseAs<decimal>(decimal.TryParse);
zdwk9cvp

zdwk9cvp3#

只需将其分解为一个扩展方法:

public static decimal? ParseDecimal(this string s)
{
    decimal d;
    if (decimal.TryParse(s, out d))
        return d;
    return null;
}

你可以这样使用它:

numericValue = numericString.TryParseDecimal();
pb3s4cty

pb3s4cty4#

怎么样:

decimal? numericValue = 
    decimal.TryParse(numericString, out temp) ? temp : null as decimal?;

如果强制转换失败,这将使numericValue为null,并且很好很干净。

waxmsbnn

waxmsbnn5#

问题是temp是一个十进制数,而null...是null。因为它们的类型不同,所以两者之间的比较失败,您会得到一个错误。
尝试以下两种方法之一:

decimal? numericValue = decimal.TryParse(numericString, out temp) ? (decimal?)temp : null;

decimal? numericValue = decimal.TryParse(numericString, out temp) ? (decimal?)temp : (decimal?)null;
xtfmy6hx

xtfmy6hx6#

我认为你应该把它 Package 在一个方法中以获得更好的可读性:

private decimal? ParseOrDefault(string decimalAsString, decimal? defaultIfInvalidString=null)
{
    decimal result;
    if (decimal.TryParse(decimalAsString, out result))
        return result;
    return defaultIfInvalidString;
}

[Test]
public void ParseOrDefaultTest()
{
    decimal? actual = ParseOrDefault("12", null);
    Assert.AreEqual(12m,actual);

    actual = ParseOrDefault("Invalid string", null);
    Assert.AreEqual(null, actual);
}
py49o6xq

py49o6xq7#

decimal?weight = decimal.TryParse(weightEditText.Text,out var tempWeight)?tempWeight:default(decimal?)

vbkedwbf

vbkedwbf8#

一个很好的使用最近C#特性的一行程序是:

var numericValue = decimal.TryParse(numericString, out var temp) ? temp : default(decimal?);

相关问题