webentwicklung-frage-antwort-db.com.de

Dezimalwert mit Datenanmerkungen auf 2 Dezimalstellen überprüfen?

Ich habe das in meinem Ansichtsmodell:

[Required(ErrorMessage = "Price is required")]
[Range(0.01, 999999999, ErrorMessage = "Price must be greater than 0.00")]
[DisplayName("Price ($)")]
public decimal Price { get; set; }

Ich möchte bestätigen, dass der Benutzer nicht mehr als 2 Dezimalstellen eingibt. Also ich hätte gerne

Gültige Werte : 12, 12.3, 12.34

Ungültige Werte : 12., 12.345

Gibt es eine Möglichkeit, dies mit einer Datenanmerkung zu überprüfen?

16
Steven

Sie können das RegularExpression-Attribut mit einer Regex verwenden, die Ihren Kriterien entspricht. Es gibt hier eine ganze Reihe von Ausdrücken, die Zahlen beinhalten. Hier ist der Link .

Dies wird Ihnen den Einstieg erleichtern, obwohl es möglicherweise nicht so umfassend ist, wie Sie möchten (erfordert mindestens eine Stelle, die den Dezimalpunkt vorbelegt):

[RegularExpression(@"\d+(\.\d{1,2})?", ErrorMessage = "Invalid price")]

Beachten Sie, dass es schwierig ist, eine genaue Fehlermeldung auszugeben, da Sie nicht wissen, welcher Teil des regulären Ausdrucks nicht übereinstimmt (die Zeichenfolge "z.22" hat beispielsweise die richtige Anzahl von Dezimalstellen, ist aber kein gültiger Preis ).

23
jlew
[RegularExpression(@"^\d+.\d{0,2}$",ErrorMessage = "Price can't have more than 2 decimal places")]
public decimal Price { get; set; }

Dies wird für 0 bis 2 Dezimalstellen oder gar keine sorgen.

18
Jonathan

Sie können auch ein eigenes Dezimalvalidierungsattribut erstellen, das von RegularExpressionAttribute erbt.

 public class DecimalAttribute : RegularExpressionAttribute
 {
    public int DecimalPlaces { get; set; }
    public DecimalAttribute(int decimalPlaces)
        : base(string.Format(@"^\d*\.?\d{{0,{0}}}$", decimalPlaces))
    {
        DecimalPlaces = decimalPlaces;
    }

    public override string FormatErrorMessage(string name)
    {
        return string.Format("This number can have maximum {0} decimal places", DecimalPlaces);
    }
 }

und registrieren Sie es, um die clientseitige Validierung in Application_Start () zu aktivieren:

DataAnnotationsModelValidatorProvider.RegisterAdapter(typeof(DecimalAttribute), typeof(RegularExpressionAttributeAdapter));
5
domenu
[RegularExpression(@"^\d+(\.\d)?$", ErrorMessage = "It cannot have more than one decimal point value")]
[Range( 0.1,100)]
public double xyz{get;set;}         

Es funktioniert für mich bis zu einem Dezimalwert

4
Gurarpan

Sie können diese Überprüfung mit einem regulären Ausdruck vornehmen und mit dem RegularExpression-Attribut anwenden.

2
Ion Sapoval

Ich hatte das gleiche Szenario wie das OP, aber die Antworten geben keine Lösung, die in allen folgenden Fällen funktioniert:

12, 12.3 and 12.34

Dazu verwenden wir den folgenden regulären Ausdruck:

[RegularExpression(@"^\d+(.\d{1,2})?$")]
1
mattytommo

Ähnlich wie mattytommo . Du musst entkommen '.' - Andernfalls wird ein beliebiges Zeichen akzeptiert

[RegularExpression(@"^\d+(\.\d{1,2})?$")]
0
MichalS