Мое требование — отформатировать входные значения в определенном формате как «##. ### / ##. ###». Пример. Мое входное значение может иметь алфавиты, буквы, цифры, числа.
- Срок действия истек -> если алфавит, вывести как три пробела
- 2 -> только числа, добавьте «/» + «0» для форматирования как «##. ### / ##. ###»
- 3/2 -> «##. ### / ##. ###»
- 0.2 / 3.4 — «##. ### / ##. ###»
Приведенный ниже код работает и дает ожидаемые результаты. Есть ли лучший способ избежать нескольких условий, если
Dim input As String = KeyValueDictionary.Item(DictionaryKeyNames.input).ToString()
If Regex.IsMatch(input, "^[a-za-z ]+$") Then
input = " "
ElseIf IsNumeric(input) Then
input = input + "/" + "0"
input = String.Join("/", input.Split("/").[Select](Function(s) Decimal.Parse(s).ToString("00.000")))
ElseIf Regex.IsMatch(input, "^[0-9/.]+$") Then
input = String.Join("/", input.Split("/").[Select](Function(s) Decimal.Parse(s).ToString("00.000")))
End If
1 ответ
Вам не нужно использовать Regex
для этого, и ваше регулярное выражение в любом случае не покрывает большинство случаев. Вы можете просто разделить ввод и попробовать разобрать их на десятичные дроби. Если они содержат какие-либо недопустимые входные данные, верните три пробела (" "
) в противном случае распечатайте его в "00.000/00.000"
формат.
Function StringFormatting(input As String) As String
Dim parts = input?.Split("/").Select(
Function(s)
Dim val As Decimal
Return If(Decimal.TryParse(s, val), CType(val, Decimal?), Nothing)
End Function).ToList()
If parts Is Nothing OrElse parts.Count > 2 OrElse parts.Any(Function(v) v Is Nothing) Then
Return " "
End If
Return $"{parts(0):00.000}/{If(parts.Count = 2, parts(1), 0):00.000}"
End Function
Обратите внимание, что в приведенном выше коде предполагается, что ввод будет коротким текстом и всего несколькими "https://codereview.stackexchange.com/"
в худшем случае, в противном случае я бы предложил реструктурировать их, чтобы проверить parts Is Nothing OrElse parts.Count > 2
сначала, прежде чем пытаться разобрать их в десятичном формате, чтобы предотвратить ненужный процесс.
Тестовые примеры:
"2"
=>"02.000/00.000"
"3/2"
=>"03.000/02.000"
"0.2/3.4"
=>"00.200/03.400"
Nothing
=>" "
""
=>" "
" "
=>" "
"Expired"
=>" "
"/2.1"
=>" "
"1/"
=>" "
"2.3.2"
=>" "
"2/3/2021"
=>" "
"3/Expired"
=>" "
"4/12/Expired"
=>" "