我有以下内容:
string outOfRange = "2147483648"; // +1 over int.MaxValue
Run Code Online (Sandbox Code Playgroud)
显然,如果你有一个数字以外的东西,这将失败:
var defaultValue = 0;
int.TryParse(outOfRange, out defaultValue);
Run Code Online (Sandbox Code Playgroud)
我的问题是,因为这是一个数字,并且它会失败,你int.TryParse()怎么知道它失败了,因为字符串超出了它存储在容器的范围内?
我在让TryParse正常工作时遇到了问题.我有一个我几乎确定有效的值列表(因为它们来自我们系统中的另一个组件)但我想确保有适当的错误处理.
以下是我的值的示例列表:
20.00
20.00
-150.00
这是我最初写的方法:
private decimal CalculateValue(IEnumerable<XElement> summaryValues)
{
decimal totalValue = 0;
foreach (XElement xElement in summaryValues)
{
decimal successful;
Decimal.TryParse(xElement.Value, out successful);
if (successful > 0)
totalValue += Decimal.Parse(xElement.Value);
}
return totalValue;
}
Run Code Online (Sandbox Code Playgroud)
变量'success'在-150.00返回false,所以我添加了NumberStyles:
private decimal CalculateValue(IEnumerable<XElement> summaryValues)
{
decimal totalValue = 0;
foreach (XElement xElement in summaryValues)
{
decimal successful;
Decimal.TryParse(xElement.Value, NumberStyles.AllowLeadingSign, null, out successful);
if (successful > 0)
totalValue += Decimal.Parse(xElement.Value, NumberStyles.AllowLeadingSign);
}
return totalValue;
}
Run Code Online (Sandbox Code Playgroud)
但是,现在我在那里有NumberStyles,没有数字会解析!将IFormatProvider设置为null我感觉很好,因为这都在我们的系统中.有谁看到我可能做错了什么?
在我的ASP.net项目中,我需要为用户输入验证一些基本数据类型.数据类型类似于数字,小数,日期等.
在性能方面我应该采取的最佳方法是什么?它是通过做Regex.IsMatch()或TryParse()?
提前致谢.
我想知道为什么代码分析规则CA1305 - 指定IFormatProvider不适用于TryParse方法?
例如,使用"Microsoft All Rules"规则集,代码分析会针对以下代码提供CA1305警告:
static void Main(string[] args)
{
string text = args[0];
double value = double.Parse(text);
}
Run Code Online (Sandbox Code Playgroud)
但是没有给出以下代码的CA1305警告:
static void Main(string[] args)
{
string text = args[0];
double value;
if (!double.TryParse(text, out value))
value = 0;
}
Run Code Online (Sandbox Code Playgroud)
我发现这非常不幸,因为如果输入字符串不可靠,TryParse方法是解析的正确方法.
有谁知道TryParse方法的CA1305规则是在某些较新版本的代码分析工具中实现还是由某些第三方实现?
在我的代码中,我经常使用以下转换:
Convert.ToInt32(value, Cultureinfo.InvariantCulture);
Convert.ToDecimal(value, CultureInfo.InvariantCulture);
Run Code Online (Sandbox Code Playgroud)
我现在喜欢使用TryParse函数,因为最近的错误.我不完全确定我是否正确使用以下等价物,因为我不完全理解NumberStyles枚举.
Int64.TryParse(value, NumberStyles.Any, CultureInfo.invariantCulture, out output);
Decimal.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out output);
Run Code Online (Sandbox Code Playgroud)
在回答后编辑以下
以下代码应该是正确的替代方案:
Int64.TryParse(value, NumberStyles.Integer, CultureInfo.invariantCulture, out output);
Decimal.TryParse(value, NumberStyles.Number, CultureInfo.InvariantCulture, out output);
Run Code Online (Sandbox Code Playgroud) 代码:
Decimal kilometro = Decimal.TryParse(myRow[0].ToString(), out decimal 0);
Run Code Online (Sandbox Code Playgroud)
有些论点无效吗?
在我的应用程序中,我有一个文本框 - txtDiscount管理员可以为某个用户设置折扣百分比,或者他可能没有.在后端我想保存数据,所以现在我有这个:
double? discount = null;
if (!string.IsNullOrEmpty(txtDiscount.Text))
{
if (!double.TryParse(txtDiscount.Text, out discount)) errors.Add("Discount must be a double.");
}
Run Code Online (Sandbox Code Playgroud)
所以我得到了一个错误invalid argument,显然,discount如果我要使用它,它就不能为空TryParse.我看到很多人正在为这种情况进行扩展,但是现在我认为没有必要.我能想到的是使用另一个变量:
double? discount = null;
private double _discount;
if (!string.IsNullOrEmpty(txtDiscount.Text))
{
if (!double.TryParse(txtDiscount.Text, out _discount))
{
errors.Add("Discount must be adouble.");
}
else
{
discount = _discount;
}
}
Run Code Online (Sandbox Code Playgroud)
然后使用我的nullable discount将值传递给数据库.但实际上我不喜欢上面的代码,在我看来这个任务非常复杂,但我想不出更好的东西.那么如何在不使用扩展方法的情况下处理这种情况呢?
我有一个TextBox,用户可以在其中键入日期.我只希望以下格式:
12.12.2017
12.02.2017
12.2.2017
02.12.2017
2.12.2017
02.02.2017
2.2.2017
Run Code Online (Sandbox Code Playgroud)
所以可以有一个领先的零或不.
我目前正在使用以下代码解析DateTime:
DateTime myDate = new DateTime();
bool success = DateTime.TryParseExact(TboDate.Text, "dd.MM.yyyy",
CultureInfo.CurrentUICulture, DateTimeStyles.None, out myDate);
Run Code Online (Sandbox Code Playgroud)
12.2.2017无法使用该代码成功解析日期.但我不想每次都检查字符串,然后用匹配的格式解析它d.M.yyyy, dd.M.yyyy, d.MM.yyyy,依此类推.是否有更简单的方法来告诉方法,可以有前导零?
给定一个变体,VBScript是否有相当于C#的DateTime.TryParse方法?
我试图弄清楚.NET 4.0的Enum.TryParse是否是线程安全的.
源代码(反编译)是:
[SecuritySafeCritical]
public static bool TryParse<TEnum>(string value, bool ignoreCase, out TEnum result) where TEnum : struct
{
result = default(TEnum); /// (*)
Enum.EnumResult enumResult = default(Enum.EnumResult);
enumResult.Init(false);
bool result2;
if (result2 = Enum.TryParseEnum(typeof(TEnum), value, ignoreCase, ref enumResult))
{
result = (TEnum)enumResult.parsedEnum;
}
return result2;
}
Run Code Online (Sandbox Code Playgroud)
对我来说似乎有问题的是这一行:
result = default(TEnum); /// (*)
Run Code Online (Sandbox Code Playgroud)
如果另一个线程在将其设置为默认值之后,并且在将其设置为已解析值之前访问结果,该怎么办?
[编辑]按照Zoidberg的回答,我想稍微改一下这个问题.
问题是,我想,如果Enum.TryParse是"事务性的"(或原子的).
假设我有一个静态字段,并将其传递给Enum.TryParse:
public static SomeEnum MyField;
....
Enum.TryParse("Value", out MyField);
Run Code Online (Sandbox Code Playgroud)
现在,当执行TryParse时,另一个线程访问MyField.TryParse会将MyField的值更改为SomeEnum的默认值一段时间,然后才会将其设置为已解析的值.
这不一定是我的代码中的错误.我希望Enum.TryParse能够将MyField设置为已解析的值,或者根本不触摸它,而不是将其用作临时字段.