VB6 - преобразование строки в удвоение с использованием определенной культуры? - PullRequest
3 голосов
/ 22 марта 2012

Я давно работаю на C # и в последнее время мне приходилось смотреть код VB6.После некоторого копания мы обнаружили, что где-то каким-то образом мы храним число в виде строки.Сейчас мы читаем его обратно, и наш код не очень хорошо обрабатывает культурные различия.Вот пример:

Dim text as String
Dim myVal as Double
Set text = "1,123456"
'This sets the value of myVal to 1123456 on our system - incorrect
myVal = text

Set text = "1.123456"
'This sets the value of myVal to 1.123456 on our system - correct
myVal = text

Имея в виду, что это VB6, а не VB.NET, существуют ли какие-либо встроенные методы, функции, что угодно, которые могут преобразовать строку в тип double с использованием определенногокультура?Или, по крайней мере, намекнув на преобразование, что мы можем иметь дело с другим форматом?

Мы все еще копаем, как записывается значение, и посмотрим, сможем ли мы перепроектировать процесс, чтобы получить согласованный результат,Тем не менее, наши клиенты уже имеют (имеют) данные в одном или другом формате (или оба, мы проверяем ...), поэтому правильный алгоритм или реализация преобразования будет лучшим ответом на этом этапе.

Ответы [ 2 ]

7 голосов
/ 22 марта 2012

В прошлом я использовал эту быструю и грязную функцию, чтобы получить двойное значение из текста. Здесь, в Аргентине, люди иногда используют точку и запятую для разделения десятичных значений, поэтому эта функция готова принять оба формата. Если присутствует только одна пунктуация, предполагается, что это десятичный разделитель.

function ConvertDBL( texto )
    dim retval, SepDecimal, SepMiles
    If texto = "" then texto = "0"
    retval = replace(trim(texto), " ", "")
    If cdbl("3,24") = 324 then
        SepDecimal = "."
        SepMiles = ","
    else
        SepDecimal = ","
        SepMiles = "."
    end if  
    If InStr( Retval, SepDecimal ) > 0 then
        If InStr( Retval, SepMiles ) > 0 then
            If InStr( Retval, SepDecimal ) > InStr( Retval, SepMiles ) then
                Retval = replace( Retval, SepMiles, "" )
            else
                Retval = replace( Retval, SepDecimal, "" )
                Retval = replace( Retval, SepMiles, SepDecimal )
            end if
        end if      
    else
        Retval = replace( Retval, SepMiles, SepDecimal )
    end if
    ConvertDbl = cdbl( retval ) 
end function
2 голосов
/ 23 марта 2012

Вы не можете выбрать произвольную культуру, передав объект культуры, как вы можете в .Net.Вы можете выбрать:

  • Функции, которые всегда используют текущие региональные настройки.CStr, Format, CDbl и т. Д. Неявные преобразования (например, те, что в вашем вопросе) также используют текущие региональные настройки.
  • Функции, которые всегда используют региональные настройки США (аналогично инварианту .Netкультура).Str, Val

Обычно текущие региональные настройки берутся из панели управления.Есть слухи , что вы можете позвонить SetThreadLocale, чтобы изменить региональные настройки из кода во время выполнения - никогда не пробовал сам.

...