Как будет выглядеть часть кода vba на c#?

209
13 октября 2021, 01:40

Подскажите как будет выглядеть эти два кусочка кода на c#?

tmp_String = Trim(In_String) 
tmp_Length = Len(tmp_String) 
If tmp_Length <> 8 Then
    tmp_Out = False
Else
    tmp_Out = True
End If
tmp_Out = tmp_Out And IsNumeric(tmp_String)
If (tmp_Out = True) Then
    N1 = Val(Left(tmp_String, 1))
    N2 = Val(Mid(tmp_String, 2, 1))
    N3 = Val(Mid(tmp_String, 3, 1))
    N4 = Val(Mid(tmp_String, 4, 1))
Else
End if
If (K8 < 10) Then
    tmp_Des = 10
    tmp_Ed = Val(Right(Trim(Str(K8)), 1))
Else
    tmp_Des = (Val(Left(Trim(Str(K8)), 1)) + 1) * 10
    tmp_Ed = Val(Right(Trim(Str(K8)), 1))
End If

Вызвала трудности эта строка tmp_Out = tmp_Out And IsNumeric(tmp_String)

Answer 1

Для преобразования многих стандартных типов между собой можно использовать статический класс Convert с его многочисленными методами

Val(str) >> Convert.ToInt32(str)

Аналогов Right и Left нет в стандартных средствах, поэтому придётся использовать метод извлечения подстроки.

Right(str,len) >> str.Substring(str.Length -len, len)

Left(str,len) >> str.Substring(0,len)

С обрезанием пробелов с двух сторон и взятием длины строки всё просто

Trim(str) >> str.Trim()

Len(str) >> str.Length()

С методом взятия подстроки нужно учитывать нюанс. В c# нумерация символов начинается с 0, а в VBA с 1

Mid(str,pos,len) >> str.Substring(pos-1,len)

Аналогом IsNumeric можно считать Int32.TryParse, только он мощнее -- ещё и результат возвращает во втором выходном параметре. Но раз он нам не нужен, его можно проигнорировать с помощью _

IsNumeric(str) >> Int32.TryParse(str, out _)

И так, вот как преобразуются, например, следующие выражения

(Val(Left(Trim(Str(K8)), 1)) + 1) * 10 >> (Convert.ToInt32(K8.ToString().Trim().SubString(0,1)) + 1) * 10

tmp_Out = tmp_Out And IsNumeric(tmp_String) >>

tmp_Out &= Int32.TryParse(tmp_string, out _);

Объяснять про разницу в блоках if-else я думаю здесь не стоит. Также и переводить весь код на c# и печатать здесь полный листинг.

Ещё пару слов про And. Полным аналогом flag1 = flag1 And flag2 будет flag1 = flag1 & flag2. Его можно сократить так, как я указал выше flag1 &= flag2. Но правильным вариантом с учётом семантики вашего кода будет flag1 = flag1 && flag2. Потому что, оператор && сэкономит машинное время и не станет вычислять правое выражение, если flag1 равен false. Аналогов в VBA такому удобному поведению, насколько я знаю, нет.

READ ALSO
Модульный тест класса

Модульный тест класса

при написании модульного теста возникает ошибка "object не содержит определения для qwerty"

153
Стоит ли боятся DownCast&#39;а(конкретизация типа)?

Стоит ли боятся DownCast'а(конкретизация типа)?

Допустим, есть 3 интерфейса:

146
конфликт при миграции Code First

конфликт при миграции Code First

Подскажите в чем может быть проблема, вылетает ошибка при миграции на добавление связи между таблицами

136
Как можно сформировать проверку на строку?

Как можно сформировать проверку на строку?

У меня есть проверка такого рода GetName если находит подходящую строчку в тексте path то возвращает определённый текст

216