Ich schreibe eine Bibliothek für das Produkt unseres Unternehmens, die jede Art von architektonischer Dimension annehmen wird, die unsere Benutzer bereits als Eingabe für eine Funktion kennen, die von einem String in ein Double konvertiert. Hier ist die Liste der Eingabetypen, die wir gerne hätten.
Input
| Bedeutung | Output
(durch ein Double dargestellte Inches)
12.5'
| 12 Fuß und sechs Zoll | 150.0
11"
| 11 Zoll | 11.0
3/16"
| 3 Sechzehntel eines Zolls | 0.1875
Leerzeichen können zwischen den Fuß- und Zollangaben und den Zoll- und Sechzehntelangaben verwendet werden oder auch nicht
11' 11"
| 11 Fuß und 11 Zoll | 143.0
11'11"
| 11 Fuß und 11 Zoll | 143.0
Bindestriche können zwischen Fuß und Zoll oder zwischen Zoll und Sechzehntel oder beiden verwendet werden.
12'-11"
| 12 Fuß und 11 Zoll | 155.0
12' 11 3/16"
| 12 Fuß und 11 Zoll und 3 Sechzehntel | 155.1875
12' 11-1/2"
| 12 Fuß und 11 Zoll und 8 Sechzehntel | 155.5
Es kann eine beliebige Anzahl von Leerzeichen zwischen Fuß und Zoll und Zoll und Sechzehntel verwendet werden.
12' 11 1/2"
| 12 Fuß und 11 Zoll und 8 Sechzehntel | 155.5
Ein alternatives, einfacheres Format ist ebenfalls verfügbar
121103
| 12 Fuß und 11 Zoll und 3 Sechzehntel | 155.1875
Negative sind auch in jedem Format möglich
-121103
| 12 Fuß und 11 Zoll und 3 Sechzehntel | -155.1875
-11'11"
| 11 Fuß und 11 Zoll | -143.0
Wir verwenden derzeit eine extrem komplizierte Verzweigungslogik, um zu versuchen, zu bestimmen, welches Format die Eingabe zu emulieren versucht ... Und es funktioniert nicht in allen Fällen.
Gibt es eine mögliche Kombination von LINQ und Regulären Ausdrücken und Hexerei, die wir verwenden können, um zu bestimmen, wie die Zeichenfolge analysiert wird?
Beachten Sie auch, dass wir wirklich vermeiden wollen, eine einfache Combobox in das Formular einzugeben, um den Eingabeformat-Typ auszuwählen.
Diese Funktion funktioniert für Ihre Eingabewertbeispiele.
%Vor%Bitte beachten Sie, dass ich keine Anstrengungen unternommen habe, andere Eingaben als die von Ihnen gelieferten zu testen. Sie möchten z.B. Überprüfen Sie in mindestens einigen Erfassungsgruppen auf Erfolg, oder führen Sie die Validierung möglicherweise als separaten Schritt durch. Dieser Code wurde unter Berücksichtigung von Parsing erstellt.
Bearbeiten:
Hier ist eine robustere Version:
%Vor%Bei leeren Strings und Strings mit zusätzlichen Zeichen, die in den Beispielen nicht zulässig sind, schlägt es fehl. Fünf oder mehr Ziffern werden als das einfachere Format behandelt.
Die Änderungen sind die Anfangs- und Endanker und erlaubten führende und nachfolgende Leerzeichen sowie die Sonderfallprüfung für empty / whitespace-only Zeichenfolge in der if-Anweisung.
Haftungsausschluss: Dies wurde offensichtlich nicht für jede mögliche illegale Eingabe getestet, und ich bin sowieso kein c # -Programmierer: -)
Dies kann Ihre Komplexität von der Verzweigungslogik zur Regex-Logik verschieben:
%Vor% Wenn group special übereinstimmt, haben Sie die spezielle Syntax und geben feet * 12 + inch + _ sixt_ / 16 mit% aus. co_de% für die Gruppen.
Wenn nicht, haben Sie eine oder mehrere der Gruppen Fuß , Zoll , Zahl und Anteil wenn die Eingabe erfolgt ist gültig. Verwenden Sie ToDecimal
für Fuß und ToDecimal für den Rest und stellen Sie sicher, dass Sie im Bruch nach Division durch Null suchen.
Proof-of-Concept-Demonstrationscode (Ruby):
%Vor%Ausgabe:
%Vor%Bitte beachten Sie, dass ich keine Anstrengungen unternommen habe, andere Eingaben als die von Ihnen gelieferten zu testen. Sie möchten z.B. Suchen Sie in mindestens einigen der Erfassungsgruppen nach Nicht-Null-Werten, oder führen Sie die Validierung möglicherweise als separaten Schritt durch. Dieser Code wurde unter Berücksichtigung von Parsing erstellt.
Tags und Links string c# linq regex string-parsing