gpt4 book ai didi

c# - 作为数据注释属性值的动态表达式

转载 作者:太空宇宙 更新时间:2023-11-03 22:49:16 26 4
gpt4 key购买 nike

我有一个 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 定义为 decimaldouble 并让 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com