2010-12-01 6 views
1

Я в настоящее время конвертирую vb и vb.net в C#, но имею проблему. Я бы очень хотел, чтобы не использовать visualbasic dll в преобразованном коде и до сих пор делал это хорошо.Можно ли конвертировать vb6 "Val()" в C#?

Но этот код

Dim x as Double 'this was error saying it was integer 
x = Val("1 23 45 x 6") ''#x is 12345 
x = Val("1..23") ''#x is 1.23 
x = Val("1 1,,,,,2,2..3") ''#x is 1122.3 

Не работает так же, как VB6 даже с помощью «Вал» из visualbasic.conversion.dll Есть ли кто, что решил это работать так же? Лучшим было бы решение C#.

+15

Как х 1.23, когда она объявляется быть целым числом? – 2010-12-01 15:21:30

+2

Это один из тех дробных целых чисел, теперь все это причуда ... – SWeko 2010-12-01 15:25:04

+3

Лично я считаю, что эта функция безумна. Если немецкий (не программист) входит в «1,23», он не будет доволен результатом 123 вместо 1.23 – CodesInChaos 2010-12-01 15:35:57

ответ

0

Из ваших примеров это может быть похоже на это. Но так как я не знаю спецификации VB val, она может не работать на всех строках правильно.

Decimal ParseNumerString(string s) 
{ 
    Decimal value=0; 
    Decimal multiplier=1; 
    bool decimalPart=false; 
    foreach(char c in s) 
    { 
     if(IsDigit(c)) 
     { 
     int i=ParseDigit(c); 
     if(!decimalPart) 
     { 
      value=value*10+i; 
     } 
     else 
     { 
     muliplier/=10; 
     value=value+multiplier*i; 
     } 
     if(c=='.') 
     decimapPart=true; 
     } 
     return value; 
} 

Это псевдокод, который необходимо реализовать для разбора цифры и ввести цифру самостоятельно (тривиально). Я выбрал Decimal как внутреннее представление, потому что таким образом я не получаю странных ошибок округления в дробной части.

4

Я ничего не знаю об этой VisualBasic.Conversion.dll (и не google), но пространство имен Microsoft.VisualBasic (в Microsoft.VisualBasic.dll) является частью основной структуры и прекрасно подходит и приемлемо для использования с C# , Есть и другие красивые драгоценные камни (TextFieldParser), но это должно быть точная реализация Val(), в которой вы нуждаетесь.

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

Вне этого, принятые пути в C# для преобразования строк в целые числа являются int.Parse(), int.TryParse() и Convert.ToInt32(). Но, нравится это или нет, функция Val() из библиотеки Microsoft.VisualBasic.dll - это самое близкое совпадение, которое вы найдете для существующего поведения вашего кода.

0

Вы можете использовать класс Convert static. Это довольно близко к Val(), но вам нужно указать тип преобразования. Он находится в пространстве имен System.

Например:

int x = Convert.ToInt32("23"); 
int y = Convert.ToDouble("23.342"); 

http://msdn.microsoft.com/en-us/library/system.convert(v=vs.71).aspx

2

Ничего из вышеперечисленного не казалось, чтобы удовлетворить свои потребности, поэтому я написал следующее:

public static Double Val(string value) 
{ 
    String result = String.Empty; 
    foreach (char c in value) 
    { 
     if (Char.IsNumber(c) || (c.Equals('.') && result.Count(x => x.Equals('.')) == 0)) 
      result += c; 
     else if (!c.Equals(' ')) 
      return String.IsNullOrEmpty(result) ? 0 : Convert.ToDouble(result); 
    } 
    return String.IsNullOrEmpty(result) ? 0 : Convert.ToDouble(result); 
} 

Результаты данных испытаний:

"0 1 5.2123 123.123. 1 a" возвращается 15.21233123

" 1 5.2123 123a" возвращает 15.21233123

"a1 5.2123 123.123. 1 a" возвращает 0

"" возвращает 0

0

Там нет точного эквивалента функции валь vb6 в C#.Но эту функцию можно использовать, используя пространство имен Microsoft.VisualBasic в C#.

Для использования функции VAL() в C# добавить Microsoft.VisualBasic имен и использовать следующий код:

Conversion.Val("09sdf"); 
Смежные вопросы