Форматирование строки

Мое требование — отформатировать входные значения в определенном формате как «##. ### / ##. ###». Пример. Мое входное значение может иметь алфавиты, буквы, цифры, числа.

  1. Срок действия истек -> если алфавит, вывести как три пробела
  2. 2 -> только числа, добавьте «/» + «0» для форматирования как «##. ### / ##. ###»
  3. 3/2 -> «##. ### / ##. ###»
  4. 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 ответ
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" => " "

    Добавить комментарий

    Ваш адрес email не будет опубликован. Обязательные поля помечены *