我有一个 ASP.NET Core 2 项目,我在其中使用注释来验证货币字段,如下所示:
public class Record {
public const string CurrencyRegex = @"^[$]?\d+[,.]?\d?\d? ?[€$]?$";
[RegularExpression(Record.CurrencyRegex, ErrorMessage = "Invalid currency format")]
public string Budget { get; set; }
问题是小数分隔符 ([,.]?\d?\d?
) 不完美。我需要对当前上下文文化敏感的表达。如果是 UK/US,小数分隔符应该被验证为 .
,但是 id 在那里,比如 FR culture,小数点应该被认为是 ,
如果可能,如何使用“上下文相关常量”作为 RegularExpression
属性值?
最佳答案
这是不可能的。传递给属性的任何值都必须是编译时常量。但是 Thread.CurrentThread.CurrentCulture
或类似的是一个运行时变量。
您可以将 Budget
定义为 decimal
或 double
并让 ModelBinder 使用当前区域性解析输入字符串。 (您必须在附加字段中传输货币符号。)
或者通过实现 IValidatableObject
来处理验证在模型上删除 [RegularExpression]
:
using System.Globalization;
using System.Text.RegularExpressions;
public class Record : IValidatableObject {
public string Budget { get; set; }
public IEnumerable<ValidationResult> Validate(ValidationContext validationContext) {
var currentDecimalSeparator =
CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator;
// no need to espace literal dot '.'
// because it is used inside a character class '[.]'
var currencyPattern = @"^[$]?\d+[" + currentDecimalSeparator + @"]?\d?\d? ?[€$]?$";
if (!Regex.IsMatch(Budget, currencyPattern)) {
yield return new ValidationResult(
$"Invalid currency format (use '{currentDecimalSeparator}' for decimal places).",
new[] { "Budget" }
);
}
}
}
关于c# - 作为数据注释属性值的动态表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48263403/