I have this in my view model:
[Required(ErrorMessage = \"Price is required\")]
[Range(0.01, 999999999, ErrorMessage = \"Price must be greater than 0.00\")]
[
To make it works for languages with decimal separator other than period (.) :
using System;
using System.ComponentModel.DataAnnotations;
using System.Globalization;
/// <summary>
/// Decimal precision validator data annotation.
/// </summary>
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field | AttributeTargets.Parameter)]
public sealed class DecimalPrecisionAttribute : ValidationAttribute
{
private readonly uint _decimalPrecision;
public DecimalPrecisionAttribute(uint decimalPrecision)
{
_decimalPrecision = decimalPrecision;
}
public override bool IsValid(object value)
{
return value is null || (value is decimal d && HasPrecision(d, _decimalPrecision));
}
private static bool HasPrecision(decimal value, uint precision)
{
string valueStr = value.ToString(CultureInfo.InvariantCulture);
int indexOfDot = valueStr.IndexOf('.');
if (indexOfDot == -1)
{
return true;
}
return valueStr.Length - indexOfDot - 1 <= precision;
}
}
Usage:
[Required(ErrorMessage = "Price is required")]
[DecimalPrecision(2)]
[DisplayName("Price ($)")]
public decimal Price { get; set; }
You can make this validation by using a regular expression and apply it with RegularExpression attribute.
[RegularExpression(@"^\d+(\.\d)?$", ErrorMessage = "It cannot have more than one decimal point value")]
[Range( 0.1,100)]
public double xyz{get;set;}
It works for me upto one decimal value
Similar to mattytommo. You need to escape '.' - otherwise ANY character will be accepted
[RegularExpression(@"^\d+(\.\d{1,2})?$")]
[RegularExpression(@"^\d+.\d{0,2}$",ErrorMessage = "Price can't have more than 2 decimal places")]
public decimal Price { get; set; }
This will cater for 0 to 2 decimal places, or none at all.
You could use the RegularExpression attribute, with a regex that matches your criteria. There are a whole bunch of expressions here that involve numbers, I'm sure one will fit the bill. Here is the link.
This will get you started, though it may not be as inclusive as you want (requires at least one digit leading the decimal point):
[RegularExpression(@"\d+(\.\d{1,2})?", ErrorMessage = "Invalid price")]
Note that it is difficult to emit a precise error message because you don't know which part of the regex failed to match (the string "z.22" has the correct number of decimal places, for example, but is not a valid price).