Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: CSng() и региональные настройки Добавлено: 30.10.07 11:11  

Автор вопроса:  NaeR | ICQ: 304499348 
Возникла проблема при преобразовнии строки в число.
Есть программа клиент базы данных, она оттуда тянет числа в текстовом формате, где разделитель точка (.). А в региональных настройках клиентов есстественно запятая. И при преобразовании вываливается ошибка. Подскажите как обойти это ограничение, или как стандартно преобразовать строку?

Ответить

  Ответы Всего ответов: 14  

Номер ответа: 1
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #1
Добавлено: 30.10.07 15:03
может, так?
Dim strVal As String
Dim sngVal As Single
strVal = "8.9"
sngVal = CSng(Replace$(strVal, ".", ",";))

Ответить

Номер ответа: 2
Автор ответа:
 NaeR



ICQ: 304499348 

Вопросов: 2
Ответов: 4
 Профиль | | #2 Добавлено: 30.10.07 17:02
Спасибо!
Просто я в VB не силён, а чужой проект надо трансформировать под сегодняшние нужды.

Ответить

Номер ответа: 3
Автор ответа:
 Winand



Вопросов: 87
Ответов: 2795
 Web-сайт: winandfx.narod.ru
 Профиль | | #3
Добавлено: 30.10.07 19:11
а если у клиента будет точка всё-таки?)

Ответить

Номер ответа: 4
Автор ответа:
 NaeR



ICQ: 304499348 

Вопросов: 2
Ответов: 4
 Профиль | | #4 Добавлено: 30.10.07 19:39
Всмысле точка в региональных настройках? Тогда наверно надо будет узнавать что именно у клиента, на то и менять...

Если знаешь как подскажи...

Ответить

Номер ответа: 5
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #5
Добавлено: 30.10.07 22:23
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Private Const LOCALE_SDECIMAL = &HE
Private Const LOCALE_USER_DEFAULT = &H400

Private Function GetSeparator() As String
    Dim Buffer As String, Ret As String
    Buffer = String$(256, 0)
    Ret = GetLocaleInfo(LOCALE_USER_DEFAULT, OCALE_SDECIMAL, Buffer, Len(Buffer))
    If Ret > 0 Then
        GetInfo = Left$(Buffer, Ret - 1)
    Else
        GetInfo = ""
    End If
End Function


Либо вручную читаешь
HKEY_CURRENT_USER\Control Panel\International значение sDecimal

Ответить

Номер ответа: 6
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #6
Добавлено: 30.10.07 22:24
ой.... ошибка.... поправка.
Private Declare Function GetLocaleInfo Lib "kernel32" Alias "GetLocaleInfoA" (ByVal Locale As Long, ByVal LCType As Long, ByVal lpLCData As String, ByVal cchData As Long) As Long

Private Const LOCALE_SDECIMAL = &HE
Private Const LOCALE_USER_DEFAULT = &H400

Private Function GetSeparator() As String
    Dim Buffer As String, Ret As String
    Buffer = String$(256, 0)
    Ret = GetLocaleInfo(LOCALE_USER_DEFAULT, OCALE_SDECIMAL, Buffer, Len(Buffer))
    If Ret > 0 Then
        GetSeparator = Left$(Buffer, Ret - 1)
    Else
        GetSeparator = ""
    End If
End Function

Ответить

Номер ответа: 7
Автор ответа:
 Viper



ICQ: 249094859 

Вопросов: 0
Ответов: 310
 Профиль | | #7 Добавлено: 01.11.07 08:47
нды... все делается гораздо проще
Format$(0, ".";)
- врзвращает именно тот символ, который является разделителем целой и дробной части здесь и сейчас

Ответить

Номер ответа: 8
Автор ответа:
 



Администратор

ICQ: 278109632 

Вопросов: 42
Ответов: 3949
 Web-сайт: domkratt.com
 Профиль | | #8
Добавлено: 01.11.07 09:57
хм.... а я как только с Format ни извращался, тоже пытался получить =) Бум знать, спасибо.

Ответить

Номер ответа: 9
Автор ответа:
 Иван



Вопросов: 34
Ответов: 53
 Web-сайт: www.harami.ru
 Профиль | | #9
Добавлено: 06.11.07 14:47
Вообще-то, смотря что Вы собираетесь делать с числом, полученным из ЧИСЛОВОГО поля базы данных.
Если производить дальнейшие вычисления, то нужно сохранить точку.
Если же вывести в текст-боксе, то я обычно в таких случаях использую функцию Replace(CStr(myValue), ".", ",";)
-- где myValue — числовое значение, а вместо "," можно использовать десятичный разделитель региональных стандартов, прочитанный одним из способов, указанных в предыдущих постах.

Если же в базе данных числа хранятся в ТЕКСТОВОМ формате (хотя не понятно, зачем нужно так усложнять себе жизнь), то для выполнения вычислений преобразуйте текст в число с помощью функции Val(), а для вывода значений в текст-боксе соответственно: Replace(myValue, ".", ",";)

Ответить

Номер ответа: 10
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #10 Добавлено: 06.11.07 15:33
Нужно использовать InvariantCulture

Ответить

Номер ответа: 11
Автор ответа:
 shuffle



Администратор

ICQ: 201502381 

Вопросов: 15
Ответов: 737
 Профиль | | #11 Добавлено: 06.11.07 15:51
Нужно беречь здоровье — не нужно программировать.

Ответить

Номер ответа: 12
Автор ответа:
 gvozd



Разработчик Offline Client

Вопросов: 164
Ответов: 1317


 Web-сайт: www.gvozdsoft.com
 Профиль | | #12
Добавлено: 06.11.07 20:11
shuffle, золотые слова!

Ответить

Номер ответа: 13
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #13 Добавлено: 08.11.07 18:21
Ну да. А меня программирование отвлекает от пива. Как мне быть? :(

Ответить

Номер ответа: 14
Автор ответа:
 Mr.Smile



ICQ: 427682013 

Вопросов: 14
Ответов: 464
 Профиль | | #14 Добавлено: 11.11.07 00:41
Как, как... Напиться пива и сесть программировать! :)

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам