gpt4 book ai didi

c# - 正则表达式十进制范围表达式。负值到正值

转载 作者:行者123 更新时间:2023-11-30 15:21:37 24 4
gpt4 key购买 nike

我正在尝试创建一个正则表达式来验证应在 -12.0 到 +13.0 范围内的字段(十进制)。

我能够执行此正则表达式 ^[-+]?(?:[0-9]|[0-1][0-2](?:[.][0-9] )?)$ 但这还不够,因为这将允许 -12.9 到 +12.9 值并且不会验证 0 或 0.0 之类的东西。

我知道这不是最佳解决方案,更好的方法是使用模型并使用数据注释添加正则表达式验证。

这里的主要问题是 Model.Value 是一个字符串。但是在更新数据库值之前,我需要以多种不同的方式验证该字符串。我验证该字符串的方法是使用外键,它会告诉我要使用的正则表达式。

想象一下这个模型。

模型A

public virtual int Id{ get; set; }
public virtual IList<ModelB> ModelB{ get; set; }

模型 B

public virtual string Value { get; set; }
public virtual DataType DataType{ get; set; }

并且在 DataType 中,我对该特定值进行了正则表达式验证

这就是我使用这种方法的原因......

有人可以帮我完成这个吗?

感谢您的帮助。

最佳答案

因为您正在执行 Web 客户端验证,所以您不能使用 Decimal.Parse()(或更好的 Decimal.TryParse()),但是数据注释已经有了你需要什么。假设您的 ViewModel 中有此属性:

public class MyModel {
[RegularExpression("^[-+]?(?:[0-9]|[0-1][0-2](?:[.][0-9])?)$")]
public decimal Value { get; set; }
}

是的,您可以修复此正则表达式,但它们不是处理数值范围验证的最佳工具,表达式将很快变得非常复杂,并且 - 通常 -它不容易演变以适应不断变化的需求(如果您需要验证(-100..+1000.3] 怎么办?)如果正则表达式是您真正需要的(而不仅仅是什么你想使用)然后使用 AdrianHHH's answer(并且不要忘记包括用户对小数点分隔符的区域设置处理),如果不是(并且关于你的环境的假设是有效的)然后使用这个:

public class MyModel {
[Range(typeof(decimal), "-12", "13")]
public decimal Value { get; set; }
}

就是这样。请注意,如果您使用的是 double 而不是 decimal,那么它可能会进一步简化为 [Range(-12.0, 13.0)]。参见 MSDN了解详情。


编辑:根据您的编辑,您的场景有点复杂,但我仍然建议不要因此滥用正则表达式,正确方法(数据注解)仍然是一个可行的解决方案。首先让我们创建一个自定义验证类:

[AttributeUsage(AttributeTargets.Property)]
public class ComplexLogicAttribute: ValidationAttribute, IClientValidatable
{
protected override ValidationResult IsValid(object value, ValidationContext validationContext)
{
var model = (MyModel)validationContext.ObjectInstance;

if (IsValueValidForGivenObject(model, Convert.ToString(value)))
return ValidationResult.Success;

// Or your own error message...
return new ValidationResult(FormatErrorMessage(null));
}

public IEnumerable<ModelClientValidationRule> GetClientValidationRules(ModelMetadata metadata, ControllerContext context)
{
var modelClientValidationRule = new ModelClientValidationRule
{
ValidationType = "complexlogic",
ErrorMessage = ErrorMessage
};

return new List<ModelClientValidationRule> { modelClientValidationRule };
}
}

IsValueValidForGivenObject() 框架是:

private bool IsValueValidForGivenObject(MyModel model, string value)
{
decimal minimum = CalculateMinimumAccordingToVeryComplexLogic(model);
decimal maximum = CalculateMaximumAccordingToMagic(model);

decimal number;
if (!Decimal.TryParse(value, out number))
return false;

if (number < minimum || number > maximum)
return false;

return PerformEvenMoreComplexEsotericValidation(model, number);
}

现在您必须提供客户端验证(假设在 ComplexLogic.js 中,不要忘记包含它):

$.validator.addMethod("complexlogic", function (value, element, params) {
// Repeat your validation logic here!
return true;
});

$.validator.unobtrusive.adapters.add("complexlogic", function (options) {
options.messages["complexlogic"] = options.message;
});

查看this simple tutorial为了更好的解释。就是这样,您正在将数字验证为数字并且您的代码足够灵活......

关于c# - 正则表达式十进制范围表达式。负值到正值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37148059/

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