функции CSng и CDbl

Автор y_nikitin, 18 августа 2013, 21:04

0 Пользователи и 1 гость просматривают эту тему.

y_nikitin

При применении этих функций строка преобразуется в целое без дробной части,
например:
stroka = "12,35"
a =  CDbl(stroka)
MsgBox (a) ' получаем 12
a= CSng(stroka)
MsgBox (a) ' получаем 12
Как получить правильное преобразование, т.е в данном примере 12,35 ?

Hasim

Все нормально.


[вложение удалено Администратором]

y_nikitin

из скриншота видно , что этот офис под MS Windows, а у меня Linux Ubuntu.
Я тоже пробовал в OpenOffice , так получил нормальные результаты как у вас!

JohnSUN

Ничто не ново под Луной...

Заглядываем в CyrillicTools, модуль SumLitManage и в 182 строке читаем:
sTestString = LTrim (oSelections (i).getString())
' Workaround for a bug in CDbl. See
' http://www.openoffice.org/issues/show_bug.cgi?id=21413
'
If sTestString <> "" Then
sTestString = join (split (sTestString, ","), ".")
End If
dInValue = Val (sTestString)
В общем, бери вызов функции в Try-Exept (в смысле, On Error GoTo...) и если преобразовать строку не получилось - меняй разделитель дробной части и пытайся преобразовать еще раз... Или не мучайся с преобразованиями и сразу используй не .getString(), а .getValue()
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

Цитата: JohnSUN от 19 августа 2013, 09:38В общем, бери вызов функции в Try-Exept (в смысле, On Error GoTo...) и если преобразовать строку не получилось - меняй разделитель дробной части и пытайся преобразовать еще раз...
Типа: "чеши правое ухо мизинцем левой ноги".

VlhOwn

#5
LO Версия: 4.1.0.4
ID сборки: 410m0(Build:4)
Ubuntu 13.04

Проверьте Региональные форматы в Параметрах системы в Ubuntu. Видимо, у Вас не "россия".

[вложение удалено Администратором]

y_nikitin

У меня локализация Россия, но Linux Ubuntu 12.04 presize.
Все обновления ставится всегда! В общем написал я свою фунцию для преобразовани строки в Single, кому интересно, то вот она:
Function CSng1(st as String) as Single
Dim number as Single
num =Len(st) - InStr(1,st, ",")
number = Val (st)
if (InStr(1,st, ",")) <> 0 then
while num > 0
number = number/10
num = (num - 1)
WEnd
End if
CSng1 = number
End Function

VlhOwn

#7
Что-то у Вас, действительно, не так с настройками.
Проверил - смена регионального формата в Ubuntu влияния не оказывает, с "английский (США)" результат такой же.
А вот если поменять настройки в LO (Сервис-Параметры-Настройки языка-Языки-Локальные настройки) на английский, то результат не замедлит сказаться. Правда, добиться Вашего эффекта мне не удалось - строка "12,35" преобразуется CDbl в число 1235.

Что касается Вашей функции, то не проще ли выполнить преобразование
numb = CDbl( join( split( stroka, ","), "."))

Это, кстати, будет и проверкой - если результат будет 12.35, то дело точно в настройках локализации.

y_nikitin

Это я еще раньше проверял, так при замене , на . выдает ошибку несовместимости типов, т.е. правильно в русской локализации десятичной точки нет!