|
Преобразовать строку к числу - более-менее универсальное есть..? | ☑ | ||
---|---|---|---|---|
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 ;-)
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |