powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Разделитель между целой и дробной частью на локальной машине
13 сообщений из 13, страница 1 из 1
Разделитель между целой и дробной частью на локальной машине
    #32472525
KostyaSPB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как узнать, что является разделителем между целой и дробной частью, точка или запятая, из кода ВБ?
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32472608
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очень хитро:
Код: plaintext
1.
2.
dim x as currency
x =  1 / 5 
debug.print mid(x, 2 , 1 )
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32472681
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Deminik - все не так просто, Ваш пример вернет разделитель для типа Currency - для чисел он может быть другим.
IMHO, лучше покопать в сторону LocaleInfo:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
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

Public Const LOCALE_NOUSEROVERRIDE = &H80000000
Public Const LOCALE_SDECIMAL = &HE
Public Const LOCALE_SGROUPING = &H10
Public Const LOCALE_STHOUSAND = &HF
Public Const LOCALE_SDATE = &H1D
Public Const LOCALE_SSHORTDATE = &H1F
Public Const LOCALE_SLONGDATE = &H20

Public Const LOCALE_SMONDECIMALSEP = &H16        '  monetary decimal separator
Public Const LOCALE_SMONTHOUSANDSEP = &H17        '  monetary thousand separator

Public Function vbGetLocaleInfo(lcInfoType&) As String
    Dim Locale As Long, lpLCData As String, cchData As Long
    lpLCData = Space( 16 )
    cchData =  16 
    If GetLocaleInfo(Locale, lcInfoType, lpLCData, cchData) Then vbGetLocaleInfo = Left$(lpLCData,  1 )

'пример вызова
'Dim nDec$, nThou$, mDec$, mThou$, msg$
'
'nDec = vbGetLocaleInfo(LOCALE_SDECIMAL) ' десятичный разделитель для чисел
'mDec = vbGetLocaleInfo(LOCALE_SMONDECIMALSEP) ' то же для денег

End Function
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32472730
Фотография Deminik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Hibernate

Полностью согласен, я и не надеялся, что все будет так легко и просто...
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32472742
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно то же организовать и по другому. В регистре прописаны все эти значения, их нетрудно прочитать.


Magnus
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32473537
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Magnus23:
В регистре прописаны все эти значения
конечно, где ж еще им быть-то. разве что еще может в каких-то древних виндах в inf-файле каком-нить :-))
только чтобы их прочитать, надо:
1.Знать где они лежат
2.Иметь гарантии, что они там будут лежать после выхода очередного SP ;-)
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32474334
KostyaSPB
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем ОГРОМНОЕ СПАСИБО!!!
Завтра попробую и напишу результат, какой бы он ни был.
:)
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32474371
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"HKEY_CURRENT_USER\Control Panel\International"

Вот тут лежит все что нам может понадобится. Я как то давно было и класс слабал чтоб не парится с ними больше никогда. До сих пор иногда пользуюсь.
Там конечно можно многое повыкидать...

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
Option Explicit
Private Const REG_SZ =  1  '' Unicode nul terminated string

Private Const SYNCHRONIZE = &H100000
Private Const STANDARD_RIGHTS_READ = &H20000
Private Const STANDARD_RIGHTS_WRITE = &H20000
Private Const STANDARD_RIGHTS_EXECUTE = &H20000
Private Const STANDARD_RIGHTS_REQUIRED = &HF0000
Private Const STANDARD_RIGHTS_ALL = &H1F0000
Private Const KEY_QUERY_VALUE = &H1
Private Const KEY_SET_VALUE = &H2
Private Const KEY_CREATE_SUB_KEY = &H4
Private Const KEY_ENUMERATE_SUB_KEYS = &H8
Private Const KEY_NOTIFY = &H10
Private Const KEY_CREATE_LINK = &H20
Private Const KEY_READ = ((STANDARD_RIGHTS_READ Or KEY_QUERY_VALUE Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY) And (Not SYNCHRONIZE))
Private Const KEY_WRITE = ((STANDARD_RIGHTS_WRITE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY) And (Not SYNCHRONIZE))
Private Const KEY_EXECUTE = (KEY_READ)
Private Const KEY_ALL_ACCESS = ((STANDARD_RIGHTS_ALL Or KEY_QUERY_VALUE Or KEY_SET_VALUE Or KEY_CREATE_SUB_KEY Or KEY_ENUMERATE_SUB_KEYS Or KEY_NOTIFY Or KEY_CREATE_LINK) And (Not SYNCHRONIZE))
Private Const ERROR_SUCCESS =  0 &

Const REG_BINARY =  3  ' Free form binary
Private Const HKEY_LOCAL_MACHINE = &H80000002
Private Const HKEY_CURRENT_USER = &H80000001

Private Declare Function RegOpenKeyEx Lib "advapi32.dll" Alias "RegOpenKeyExA" (ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCreateKey Lib "advapi32.dll" Alias "RegCreateKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private Declare Function RegDeleteValue Lib "advapi32.dll" Alias "RegDeleteValueA" (ByVal hKey As Long, ByVal lpValueName As String) As Long
Private Declare Function RegSetValueEx Lib "advapi32.dll" Alias "RegSetValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal Reserved As Long, ByVal dwType As Long, lpData As Any, ByVal cbData As Long) As Long
Private Declare Function RegQueryValueEx Lib "advapi32.dll" Alias "RegQueryValueExA" (ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, lpType As Long, lpData As Any, lpcbData As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32.dll" (ByVal hKey As Long) As Long
Private Declare Function RegOpenKey Lib "advapi32.dll" Alias "RegOpenKeyA" (ByVal hKey As Long, ByVal lpSubKey As String, phkResult As Long) As Long
Private m_sSeparator As Variant
Private m_DateSeparator As String
Private m_DecimalSeparator As String
Private m_LongDate As String
Private m_ShortDate As String
Private m_ThousandDelimiter As String
Private Function RegQueryStringValue(ByVal hKey As Long, ByVal strValueName As String) As String

    '<CSCM>
    '--------------------------------------------------------------------------------
    ' Project    :       WebSurveyUI
    ' Procedure  :       RegQueryStringValue
    ' Description:       [type_description_here]
    ' Created by :        Maksym Kulykovskyy
    ' Machine    :       MKULYKOVSKYY
    ' Date-Time  :       2002-11-14-16:16:54
    '
    ' Parameters :       hKey
    '                    strValueName
    '--------------------------------------------------------------------------------
    '</CSCM>

    Dim lResult As Long, lValueType As Long, strBuf As String, lDataBufSize As Long

    '    'retrieve nformation about the key

    lResult = RegQueryValueEx(hKey, strValueName,  0 , lValueType, ByVal  0 , lDataBufSize)

    If lResult =  0  Then

        If lValueType = REG_SZ Then

            'Create a buffer
            strBuf = String$(lDataBufSize, Chr$(0))
            'retrieve the key's content
            lResult = RegQueryValueEx(hKey, strValueName, 0, 0, ByVal strBuf, lDataBufSize)

            If lResult = 0 Then

                'Remove the unnecessary chr$( 0 )'s
                RegQueryStringValue = Left$(strBuf, InStr(1, strBuf, Chr$(0)) - 1)

            End If

        ElseIf lValueType = REG_BINARY Then

            Dim strData As Integer
            'retrieve the key's value
            lResult = RegQueryValueEx(hKey, strValueName, 0, 0, strData, lDataBufSize)

            If lResult = 0 Then

                RegQueryStringValue = strData

            End If

        End If

    End If

End Function

Private Function OpenKey(hKey As Long, strpath As String) As Long

    '<CSCM>
    '--------------------------------------------------------------------------------
    ' Project    :       Project1
    ' Procedure  :       OpenKey
    ' Description:       [type_description_here]
    ' Created by :        Maksym Kulykovskyy
    ' Machine    :       MKULYKOVSKYY
    ' Date-Time  :       2002-11-14-16:16:54
    '
    ' Parameters :       hKey
    '                    strpath
    '--------------------------------------------------------------------------------
    '</CSCM>

    Dim ret&
    Dim arr() As String
    Dim I%
    Dim Result&
    
    arr = Split(strpath,  "\" )

    'Open the key
    Result = RegOpenKeyEx(hKey, arr(0), 0, KEY_ALL_ACCESS, ret)

    If Result = ERROR_SUCCESS Then

        For I = 1 To UBound(arr)

            '
            Result = RegOpenKeyEx(ret, arr(I),  0 , KEY_ALL_ACCESS, ret)

            If Result <> ERROR_SUCCESS Then

                OpenKey = - 1 
                Exit Function

            End If

        Next

    Else

        OpenKey = - 1 
        Exit Function

    End If

    OpenKey = ret

End Function

Public Property Get ThousandDelimiter() As String
    ThousandDelimiter = m_ThousandDelimiter
End Property

Public Property Get ShortDate() As String
    ShortDate = m_ShortDate
End Property

Public Property Get LongDate() As String
    LongDate = m_LongDate
End Property

Public Property Get DecimalSeparator() As String
    DecimalSeparator = m_DecimalSeparator
End Property

Public Property Get DateSeparator() As String
    DateSeparator = m_DateSeparator
End Property

Public Property Get sListSeparator() As String
    sListSeparator = m_sSeparator
End Property


Private Sub Class_Initialize()
Dim ret As Long

ret = OpenKey(HKEY_CURRENT_USER,  "Control Panel\International" )
 
    m_sSeparator = RegQueryStringValue(ret,  "sList" )
    m_DateSeparator = RegQueryStringValue(ret,  "sDate" )
    m_DecimalSeparator = RegQueryStringValue(ret,  "sDecimal" )
    m_LongDate = RegQueryStringValue(ret,  "sLongDate" )
    m_ShortDate = RegQueryStringValue(ret,  "sShortDate" )
    m_ThousandDelimiter = RegQueryStringValue(ret,  "sThousand" )

RegCloseKey ret
End Sub





Magnus
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32474470
Фотография ulis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, нафига знать, что является разделителем, ведь он по сути, всего лишь "видимое отображение" между дробной и целой частью и никак не хранится в самой переменной этого типа. Преобразуйте во-время и не надо парить голову классами или чушью, как это называет магнус.
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32474488
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, нафига знать, что является разделителем, ведь он по сути, всего лишь "видимое отображение" между дробной и целой частью и никак не хранится в самой переменной этого типа. Преобразуйте во-время и не надо парить голову классами или чушью, как это называет магнус.


Во-первых, я это чушью не называл, цитату можно?
Во-вторых, ситуаия: пользователь ввел число(2.234), его нужно использовать в расчетах а затем в базу. Внимание вопрос: что он ввел,две тыщи или 2 стясячными? Как его использовать в расчетах? Если это дробь то приведение к int ее схавает... Пользователь конечно делает глаза по семь центов.
Вот подобные ситуации и нужно отлавливать. Защита от дурака-с.

И это еще самый примитивный пример. Парился я с этой темой много, подобная проблема выскакивает в самых разных ситуациях. И не только применительно к дробному или тысячному разелителю.


Magnus
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32476065
Hibernate
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, нафига знать, что является разделителем, ведь он по сути, всего лишь "видимое отображение" между дробной и целой частью и никак не хранится в самой переменной этого типа

Или еще пример:
кидаем на форму MaskEditBox.
выставляем ему MaskEditBox.Mask = "#.##"
несмотря на то, что там понаписано в MSDN, эта гадина покажет на экране _ТОЧКУ_, а не разделитель дробной части, взятый из системных настроек.
И свойства Text и FormattedText тоже вернут строку с точкой.
Если в системных настройках выставлена запятая, то все функции типа CDbl или IsNumeric просто обламаются...
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32476114
Фотография ulis
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ругаться не в моих правилах :)
Изначально вопрос звучал именно о разделитетеле дробной и целой части.
В каждом конкретном случае нужно разбираться. Что вводит пользователь - он знает, другое дело, чтобы не дать ему ни шага влево, ни шага вправо. Приходится использовать маски и уж потом преобразовывать к нужному виду
Просто при переходе к VB.NET это (бесшабашное оперирование преобразованиями по умолчанию, которое почти разрешено в VB6) как то явно стало бросаться в глаза ... :)
...
Рейтинг: 0 / 0
Разделитель между целой и дробной частью на локальной машине
    #32476200
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не согласен, у меня то проблема возникала уже в нескольких проэктах и в самых неожиданных местах. Пользователь, если очень захочет всегда может найти в твоей программе функционал которого ты не делал :)


Magnus
...
Рейтинг: 0 / 0
13 сообщений из 13, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Разделитель между целой и дробной частью на локальной машине
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]