Имя: Пароль:
1C
 
Преобразовать строку к числу - более-менее универсальное есть..?
,
0 Злопчинский
 
16.12.21
20:20
есть процедура/функция по сабжу, чтобы всякую строку правильно жевало? наверняка есть в БСП такое...
чтобы нормально преобразовывало всякое типа
123'456-23
123'456
47
123,456.23
123.456.789,23
123 456 789.00
итд
..
????
если есть - можно код закинуть сюда?
1 Злопчинский
 
16.12.21
20:22
по идее, в общем виде же не решается
45,783 - это число 45.783 или 45783...?
2 acanta
 
16.12.21
20:25
С учетом настроек в виндоус?
3 Злопчинский
 
16.12.21
20:28
(2) нет. на входе - строка, на выходе д.б. число.
там где была сформировано число как строка - хз какие настройки и вообще хз какое форматирование
4 Злопчинский
 
16.12.21
20:35
так-то придумал с нижеследующими допущениями, но вдруг кто красивое что-то
// простые допущения:
// 1. разделитель дробной части - не более одного раза встречается
// 2. разделителем дробной части м.б. из набора ".,-"
.
но такие допущения в общем случае не позволят всегда правильно трактовать
например: 45,783 - м.б. это число с 3-мя дробными цифрами, а м.б. это число без дробной части.
.
придется вводить допущение/параметр еще один "Разрядность",
если Разрядность=2 - тогда 45,783 есть число без дробной части
если Разрядность=3 - тогда 45,783 есть либо дробное число либо целое число - опять однозначно не сказать...
5 Злопчинский
 
16.12.21
20:37
123,456,783 - тут понятнее, это число без дробной части
6 серый КТУЛХУ
 
16.12.21
20:39
напышы сам.
1) первый справа символ точки или запятой считать разделителем дробной части - если таких символов в строке больше нет - заменяем его на точку и от нее включительно переносим в промежуточную строку.
2) из остальной части исходной строки тупо вырезаются все не цифровые символы, после чего к ней справа приклеивается промежуточная строка (см.п.2) и от результата вычисляется любимая одинесовская стандартная функция "Число(..)".
7 Злопчинский
 
16.12.21
20:40
(6) это я ужо придумал
8 Злопчинский
 
16.12.21
20:41
(6) только чуток посложнее
9 Йохохо
 
16.12.21
20:42
реквизит "разделитель дробной части" на форму, в ОО вроде так например
10 Злопчинский
 
16.12.21
20:46
(9) фу, какая гадость
11 Йохохо
 
16.12.21
20:47
(10) ну отправь в работу ошибочные данные, делов то. "отряхнулся и дальше пошел" (с)
12 Злопчинский
 
16.12.21
20:51
(11) фу, какая гадость-2
13 серый КТУЛХУ
 
16.12.21
20:51
и да, вот от кого-кого, но от Серёги ну точно не ожидал таких настойчивых попыток "автоматизировать бардак" (с)
14 Злопчинский
 
16.12.21
20:54
(13) "а шо делать?!"
во входящих экселях что угодно может быть.
я почему и спрашиваю - ну стопудово это кто-то уже пилил...
15 серый КТУЛХУ
 
16.12.21
20:58
(14): не что угодно.
пилил. сразу поставил заказчика перед фактом - бардак автоматизировать низя. превратили в не-бардак, чотко оговорив форматы входных данных.
потом было иногда весело когда аргументом со стороны источника "там нихера же не нуль ну как же вы элементарных вещей не понимаете" - с нашим ответом "все элементарные вещи перечислены в вашей инструкции, остальное - ноль."
16 Злопчинский
 
16.12.21
21:04
(15) спасибо, я в курске...
17 Йохохо
 
16.12.21
21:11
(14) а может быть цена за полкило 0.5 рубль сорок 1,4?
18 Злопчинский
 
16.12.21
21:14
накидайте тестовых строк-чисел, исходим что представление числа строкой - формально правильное
19 Злопчинский
 
16.12.21
22:14
Вроде наваял, норм...
20 p-soft
 
16.12.21
22:21
уже капчу автоматом распознают, а тут ексель какой-то))
21 Злопчинский
 
16.12.21
23:12
(20) есть приблуда для браузера для автоввода капчи?
22 Hans
 
16.12.21
23:14
БСПшная функция

Функция СтрокаВЧисло(Знач Значение) Экспорт
    
    Значение  = СтрЗаменить(Значение, " ", "");
    Если СтрНачинаетсяС(Значение, "(") Тогда
        Значение = СтрЗаменить(Значение, "(", "-");
        Значение = СтрЗаменить(Значение, ")", "");
    КонецЕсли;
    
    СтрокаБезНулей = СтрЗаменить(Значение, "0", "");
    Если ПустаяСтрока(СтрокаБезНулей) Или СтрокаБезНулей = "-" Тогда
        Возврат 0;
    КонецЕсли;
    
    ТипЧисло  = Новый ОписаниеТипов("Число");
    Результат = ТипЧисло.ПривестиЗначение(Значение);
    
    Возврат ?(Результат <> 0 И Не ПустаяСтрока(СтрокаБезНулей), Результат, Неопределено);
    
КонецФункции
23 Hans
 
16.12.21
23:15
СтроковыеФункцииКлиентСервер
24 Hans
 
16.12.21
23:17
// Преобразует исходную строку в число без вызова исключений.
//
// Параметры:
//   Значение - Строка - Строка, которую необходимо привести к числу.
//                       Например, "10", "+10", "010", вернет 10;
//                                 "(10)", "-10",вернет -10;
//                                 "10,2", "10.2",вернет 10.2;
//                                 "000", " ", "",вернет 0;
//                                 "10текст", вернет Неопределено.
//
// Возвращаемое значение:
//   Число, Неопределено - Полученное число, либо Неопределено, если строка не является числом
25 Злопчинский
 
16.12.21
23:25
(24)
а "123'456'789,23" - что вернет?
а "123,238" - что вернет?
а "123,2389" - что вернет?
26 Hans
 
16.12.21
23:26
(25) ХЗ. Неохота проверять.
27 Злопчинский
 
16.12.21
23:26
фу, бяка ;-)
28 Hans
 
16.12.21
23:26
Просил БСП, вот тебе БСП.
29 Злопчинский
 
16.12.21
23:26
(28) спсб.
30 Злопчинский
 
16.12.21
23:27
осталось понять как работает ПривестиЗначение ;-)
31 Йохохо
 
16.12.21
23:30
(25) так то эксель может и 123,456.789Е-2 прислать
32 timurhv
 
16.12.21
23:31
(0) (31) В sheet1.xml ? Там разве отображение хранится, а не значение?
33 timurhv
 
16.12.21
23:33
Ну может еще на id строки ссылаться
34 Йохохо
 
16.12.21
23:41
(32) не подсказывай
35 timurhv
 
16.12.21
23:45
(34) глянул, там есть нюансы с плавающей точкой, но вопрос с форматами и региональными настройками решит в (0)
36 p-soft
 
17.12.21
00:09
(21) не, нету. я как то стараюсь такие задачи не цеплять. правильно сказали выше - надо жестко закреплять входящие форматы, иначе под всех гадать жизни не хватит.
37 Злопчинский
 
17.12.21
00:20
(31) ну, в фин.документах - вряд ли.
а 123.456,78 - вполне возможно...
38 ildary
 
17.12.21
03:19
Когда я много загружал из Excel - я делал вот так (в комментариях - альтернативные способы непосредственно перевода строки в число):

&НаСервереБезКонтекста
Функция ЗначениеВСтроку(СтрокаИсходная)
    
    Если Не ЗначениеЗаполнено(СтрокаИсходная) Или (НРег(СтрокаИсходная) = "null") Тогда
        Возврат "";
    КонецЕсли;
    
    Возврат СтрокаИсходная;
    
КонецФункции

&НаСервереБезКонтекста
Функция ЗначениеВЧисло(Знач ИсходноеЗначение, БылаОшибкаПреобразования = Ложь)
    
    ЗначениеВЧисло = ?(ЗначениеЗаполнено(ИсходноеЗначение), ИсходноеЗначение, 0); // фильтруем необычные пустые значения
    
    Если ТипЗнч(ЗначениеВЧисло) = Тип("Число") Тогда
        Возврат ИсходноеЗначение;
    ИначеЕсли ТипЗнч(ЗначениеВЧисло) = Тип("Строка") Тогда
        
        ЗначениеВЧисло = ЗначениеВСтроку(ИсходноеЗначение);
        ЗначениеВЧисло = СтроковыеФункцииКлиентСервер.СтрокаВЧисло(ЗначениеВЧисло);
        
        //ОписаниеТипа = Новый ОписаниеТипов("Число");
        //ЗначениеВЧисло = ОписаниеТипа.ПривестиЗначение(ЗначениеВЧисло);
        
        //Попытка
        //    ЗначениеВЧисло = Число(ЗначениеВЧисло);
        //Исключение
        //    
        //    ЗначениеВЧисло =  Неопределено;
        //    БылаОшибкаПреобразования = Истина;
        //    
        //КонецПопытки;
        
    Иначе
        ЗначениеВЧисло =  Неопределено;
    КонецЕсли;
    
    Возврат ЗначениеВЧисло;
    
КонецФункции
39 lEvGl
 
гуру
17.12.21
09:13
выбросить из строки все, кроме цифр(0-9), вытащить из формата ячейки количество знаков дробной части
и потом, исходные данные эксель должен хранить в каком то статичном виде, а уже потом, учитывая формат, указанный пользователем, рисовать в ячейке представление
40 lEvGl
 
гуру
17.12.21
09:25
Ячейка.NumberFormat - формат ячейки, его можно читать и устанавливать
Если не заморачиваться, то можно попробовать просто перед обработкой менять на конкретный вариант формата и будет всегда одинаковый вариант строки
41 Злопчинский
 
17.12.21
10:45
(40) "Ячейка.NumberFormat"
это подразумевает обращение к внешнему объекту, экселю.
исходим из того, что никаких экселей нет. Есть число в виде строки и всё.
42 pechkin
 
17.12.21
10:48
нейросеть пиши
43 pechkin
 
17.12.21
10:49
(41) у ячейки есть value сразу
44 Злопчинский
 
17.12.21
11:01
(43) нету экселя. есть числоввиде строки на входе функции. всё.
задрали ;-)
45 Йохохо
 
17.12.21
11:03
(44) есть (32)
46 Злопчинский
 
17.12.21
11:05
(24) кстати, а формат "(10)" где используется обычно?
47 Злопчинский
 
17.12.21
11:05
(45) задрали*2 ;-)
Глупец, лишенный способности посмеяться над собой вместе с другими, не сможет долго выносить программирование. Фредерик Брукс-младший