Имя: Пароль:
1C
 
Всехавающая функция преобразования строки в число
0 SeiOkami
 
19.09.14
12:57
Всем добра!

Есть ли где-нить функция, которая бы такие строки:

1000000.01
1,000,000.01
1 000 000,01
1 000 000.01
1.000.000,01
1000000,01
1,000,000,01
1.000.000.01

преобразовала в число 1000000.01 (миллион и одна сотая)

Понятно, что можно написать, но, вдруг уже где-то подходящее есть.
Поисковик мне не помог (
1 Maxus43
 
19.09.14
12:58
нету таких извращений готовых. имхо
2 Ёпрст
 
19.09.14
12:58
пиши сам
3 sintez1234
 
19.09.14
13:01
Есть такая функция - это я! :) У меня из всех строк получилось именно 1000000.01 в итоге. Возмешь меня на работу? :)
4 Балоун
 
19.09.14
13:02
(0) 1.000 - это сколько словами?
5 sintez1234
 
19.09.14
13:02
Вот из этой строки 1,000,000,01 программно получить 1000000.01 будет затруднительно очень.
6 PR
 
19.09.14
13:02
(0) Функция-то на 10 строчек. Стыдно должно быть, товарищ :))
7 SeiOkami
 
19.09.14
13:03
(3), с ежедневной нагруженостью пару тысяч строк и зарплатой равной нулю
При этом ответ на запрос не должен превышать секунды
=)
8 sintez1234
 
19.09.14
13:03
(4) Результат = ВсемогущаяФункция(1.000);
Сообщить(Результат);


"Тыща"
9 Балоун
 
19.09.14
13:03
(5) фигня. вот вчера слова в кавычках выковыривали..
10 PR
 
19.09.14
13:03
(5) Да легко
11 SeiOkami
 
19.09.14
13:03
(6), уверен?
12 Эльниньо
 
19.09.14
13:04
(4) Одна целая, х.й десятых
13 sintez1234
 
19.09.14
13:04
(7) Да пофиг, я согласен если ночевать у вас там можно :)
14 PR
 
19.09.14
13:04
(11) Абсолютно
15 MSII
 
19.09.14
13:04
(5) Элементарно. Значимый разделитель - самый правый, остальные игнорируем.
16 Chum
 
19.09.14
13:04
(0) п-ц! ТС, ты не дельфист случайно? На любой кипишь пытаешься искать готовую компоненту.
17 Зойч
 
19.09.14
13:04
(8) там параметры должны быть опционально
18 КонецЦикла
 
19.09.14
13:04
(11) Работай сцуко
19 PR
 
19.09.14
13:05
(15) Неудача :))
20 КонецЦикла
 
19.09.14
13:05
(15) Может его и не быть
21 sintez1234
 
19.09.14
13:05
(9) фигня, я вчера опять биржевого бота на 1с пилил, с шифрованием по SHA-512 подписью по нему же, работает по API сервера биржи, без использования никакого вспомогательного языка или приблуд, чистый 1с только. Я выйграл :P
22 MSII
 
19.09.14
13:07
(19) Почему?
(20) Если нет разделителя - это целое число. Понятно, что нужен массив возможных разделителей.
23 SeiOkami
 
19.09.14
13:07
Ну в общем, приму что её просто нет и надо написать. Всем спасибо за пинок =)
24 Балоун
 
19.09.14
13:07
(22) -> (4)
25 sintez1234
 
19.09.14
13:10
(23) а ниче, обращайся, у нас вон еще мешок люлей в углу стоит пылится
26 Ёпрст
 
19.09.14
13:11
(15) как на счет такого ?

1,000,000.010,001,01
27 Garykom
 
гуру
19.09.14
13:19
Функция ПолучитьЧисло(Строка)
    Результат = Неопределено;
    СимволыРазделители = " ,.";
    Для Каждого ТекСимвол Из СимволыРазделители Цикл
        Строка = СтрЗаменить(Строка, ТекСимвол, Символы.ПС);
    КонецЦикла;
    
    КоличествоПодстрок = СтрЧислоСтрок(Строка);
    Если КоличествоПодстрок>=2 Тогда
        РезультатСрока = "";
        Для НомерПодстроки = 1 По КоличествоПодстрок-1 Цикл
            РезультатСрока = РезультатСрока + СтрПолучитьСтроку(Строка, НомерПодстроки);
        КонецЦикла;
        РезультатСрока = РезультатСрока + "." + СтрПолучитьСтроку(Строка, КоличествоПодстрок);
    Иначе
        Результат = Число(Строка);
    КонецЕсли;
    
    Возврат Результат;
КонецФункции
28 Garykom
 
гуру
19.09.14
13:20
(27)+ затратил 9 минут ))

с тебя 500/60*9 рублей...
29 Балоун
 
19.09.14
13:20
(27) незачёт
30 shpioleg
 
19.09.14
13:20
(26) А что с ним?
Проверить справа разделитель, заменить все разделители на ничто и собрать строку с дробной частью.
ИМХО, меньше 10 строк.
31 Garykom
 
гуру
19.09.14
13:22
(29) что низзя символы из строки по Для Каждого получить?

дык я сча в режиме C# в связи с CodeHockey ))
32 PR
 
19.09.14
13:23
Если не пытаться сделать именно в десять строк, а расписать код понятнее, то вот :))

Функция ПопытатьсяПолучитьЧислоИзНеведомойМуйни(НеведомаяМуйня)
    
    Перем ПопыткаЧисла;
    Перем ПроверкаНаЧисло;
    
    ПопыткаЧисла = НеведомаяМуйня;
    
    Если Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла), 1) = "." Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 1);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла), 1) = "," Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 1);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла), 1) = " " Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 1);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла), 1) = Символы.НПП Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 1);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 1, 1) = "." Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 2) + "РазделительДробнойЧасти" + Прав(ПопыткаЧисла, 1);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 1, 1) = "," Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 2) + "РазделительДробнойЧасти" + Прав(ПопыткаЧисла, 1);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 1, 1) = " " Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 2) + "РазделительДробнойЧасти" + Прав(ПопыткаЧисла, 1);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 1, 1) = Символы.НПП Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 2) + "РазделительДробнойЧасти" + Прав(ПопыткаЧисла, 1);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 2, 1) = "." Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 3) + "РазделительДробнойЧасти" + Прав(ПопыткаЧисла, 2);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 2, 1) = "," Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 3) + "РазделительДробнойЧасти" + Прав(ПопыткаЧисла, 2);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 2, 1) = " " Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 3) + "РазделительДробнойЧасти" + Прав(ПопыткаЧисла, 2);
    ИначеЕсли Сред(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 2, 1) = Символы.НПП Тогда
        ПопыткаЧисла = Лев(ПопыткаЧисла, СтрДлина(ПопыткаЧисла) - 3) + "РазделительДробнойЧасти" + Прав(ПопыткаЧисла, 2);
    КонецЕсли;
    
    ПопыткаЧисла = СтрЗаменить(ПопыткаЧисла, ".", "");
    ПопыткаЧисла = СтрЗаменить(ПопыткаЧисла, ",", "");
    ПопыткаЧисла = СтрЗаменить(ПопыткаЧисла, " ", "");
    ПопыткаЧисла = СтрЗаменить(ПопыткаЧисла, Символы.НПП, "");
    
    ПроверкаНаЧисло = ПопыткаЧисла;
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "0", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "1", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "2", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "3", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "4", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "5", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "6", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "7", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "8", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "9", "");
    ПроверкаНаЧисло = СтрЗаменить(ПроверкаНаЧисло, "РазделительДробнойЧасти", "");
    
    Если ПроверкаНаЧисло = "" Тогда
        ПопыткаЧисла = СтрЗаменить(ПопыткаЧисла, "РазделительДробнойЧасти", ".");
        ПопыткаЧисла = Число(ПопыткаЧисла);
    Иначе
        ПопыткаЧисла = Неопределено;
    КонецЕсли;
    
    Возврат ПопыткаЧисла;
    
КонецФункции
33 PR
 
19.09.14
13:23
(22) Потому что дробной части может не быть
34 Балоун
 
19.09.14
13:23
(31) 1) сломается на "йх"
2) неясно с 1.000
35 Garykom
 
гуру
19.09.14
13:26
(33) читай код лучше тама условие у меня
36 Ёпрст
 
19.09.14
13:27
(30) какой разделитель ?
37 Garykom
 
гуру
19.09.14
13:28
(34)
1 насчет "йх" не понял
2 все ясно это 1

у меня последний разделитель это дробная часть так что все ясно ))
38 Балоун
 
19.09.14
13:28
(37) 1 - проверка на дебила
2 - я вижу там тысячу
39 PR
 
19.09.14
13:28
(35) Это точно мне?
40 Ёпрст
 
19.09.14
13:28
+36, хоть и группировка триад в дробной части, как правило, отсутствует, но мало ли, найдутся извращенцы, для которых

1,000,000.010,001,01 ----> 1000000.01000101
41 vde69
 
19.09.14
13:30
сделай по аналогии

Функция ПривестиКДате (ДатаСтрокой, Маска)
    // функция НУЖНА !!!!
    
    сГод = "";
    сМесяц = "";
    сДень = "";
    
    сДлина = стрДлина(Маска);
    Для сч = 1 по сДлина Цикл
        СимволФормата = Сред(Маска, сч, 1);
        Если СимволФормата = "d" Тогда
            сДень = сДень + Сред(ДатаСтрокой, сч, 1);
        ИначеЕсли СимволФормата = "M" Тогда
            сМесяц = сМесяц + Сред(ДатаСтрокой, сч, 1);
        ИначеЕсли СимволФормата = "y" Тогда
            сГод = сГод + Сред(ДатаСтрокой, сч, 1);
        КонецЕсли;
    КонецЦикла;
    
    Попытка
        Результат = Дата(Число(сГод), Число(сМесяц), Число(сДень));
    Исключение
        Результат = Неопределено;
    КонецПопытки;
    
    Возврат Результат;
КонецФункции
42 Garykom
 
гуру
19.09.14
13:34
(39) нет ошибся, думал что (33) относится в (27)
43 Garykom
 
гуру
19.09.14
13:37
(32) незачет, потому что нет камментов )) и дробную дальше тысячной не рассматривает...
44 Garykom
 
гуру
19.09.14
13:40
(27)+ да и никто не сказал что забыл вставить

Результат = Число(РезультатСтрока);

однако
45 MSII
 
19.09.14
13:40
(33) Тогда пипец котенку, ибо разделитель дробной части может и выглядеть как разделитель групп и пахнуть как разделитель групп.
46 shpioleg
 
19.09.14
13:52
Для 2 знаков после запятой или целого

Функция СтрокаВЧисло (Знач СтрЧисло)
    Разделитель = ?(Найти(",.",Лев(Прав (СтрЧисло,3),1)),".","");
    НовоеЧисло = СтрЗаменить (СтрЗаменить(СтрЧисло,",",""),".","");
    Возврат ("" + Лев (НовоеЧисло,СтрДлина(НовоеЧисло)-2)+Разделитель+Прав(НовоеЧисло,2));
КонецФункции
47 Котокот
 
19.09.14
13:55
(0) А че там сложного? Берешь константы К1="0123456789" и К2=".,", начинаешь просматривать свою строку начиная с последнего символа, справа налево. Если символ принадлежит К1, то оставляешь его, если принадлежит К2 и это первый встретившийся такой символ, то заменяешь на ",", иначе удаляем (таким образом оставляем последний разделитель дробной части). Если не принадлежит ни К1, ни К2 - удаляем. В итоге имеем строку, состоящую только из цифр и с первым с правого края разделителем, замененным на ",". Далее функция Число().
48 PR
 
19.09.14
13:56
(45) Да ладно-ка.
Ничего, что после разделителя дробной части может быть не более двух цифр?
49 PR
 
19.09.14
13:57
(47) Неправильно
50 Котокот
 
19.09.14
13:57
(49) Сфигали?
51 Fish
 
19.09.14
14:00
(48) Это кто тебе такую глупость сказал? Про тысячные никогда не слышал что ли?
52 Ёпрст
 
19.09.14
14:00
(50) разделитель триад будет зпт, к примеру, число не дробное - твой алгоритм из целого числа сделает дробное.. занавес
53 dmpl
 
19.09.14
14:04
(15) А если число целое?
54 Garykom
 
гуру
19.09.14
14:04
(52) про не дробные числа, ну ка, где в постановке задачи (0) есть такие?

давайте уже правильно читать ТЗ...
55 Котокот
 
19.09.14
14:06
(52) Падла... Падлавил... Ладно, пойду еще подумаю.
56 Балоун
 
19.09.14
14:06
(54) давайте. (миллион и одна сотая)
57 Garykom
 
гуру
19.09.14
14:08
(56) вообще то в данном случае " и " разделитель целой и дробной части ))
58 Балоун
 
19.09.14
14:08
ладно. где в (0) постановка задачи?
59 DS
 
19.09.14
14:08
(54) А где ТЗ? Не заметил...
60 Ёпрст
 
19.09.14
14:16
(54) ну вы што ?
"Всехавающая функция преобразования строки в число"

не должна делать такие примитивные умозаключения ????
61 PR
 
19.09.14
14:17
(50) Потому что (33)
62 Garykom
 
гуру
19.09.14
14:20
(59) "ТЗ" в данном случае "Тупое Задание"
63 PR
 
19.09.14
14:20
(51) Ну ты как всегда в своем репертуаре.
В сабже с большой долей вероятности речь про суммы.
99.99% случаев для сумм — 0, 1 или 2 знака после запятой.
64 vde69
 
19.09.14
14:21
(60) ну всеохватывающей - сделать в принцепе нельзя, по тому как в некоторых случаях будет множественность решений.

я-бы пошел по пути "обучения", там где вариант один - сразу ответ, там где несколько запомнинал выбраный пользователем правильный формат
65 dmpl
 
19.09.14
14:23
(0) В соответствии с ТЗ:


Функция ВсехавающаяФункция(Стр)
    
    Если Стр = "1000000.01" ИЛИ
        Стр = "1,000,000.01" ИЛИ
        Стр = "1 000 000,01" ИЛИ
        Стр = "1 000 000.01" ИЛИ
        Стр = "1.000.000,01" ИЛИ
        Стр = "1000000,01" ИЛИ
        Стр = "1,000,000,01" ИЛИ
        Стр = "1.000.000.01" Тогда
        Возврат 1000000.01;
    Иначе
        Возврат Неопределено;
    КонецЕсли;
    
КонецФункции
66 shpioleg
 
19.09.14
14:23
Для дробных с пофиг сколько знаков после запятой

Функция СтрокаВЧисло2 (Знач СтрЧисло)
    МногострочнаяСтр = СтрЗаменить (СтрЗаменить(СтрЧисло,",",Символы.ПС),".",Символы.ПС);
    Хвост = СтрПолучитьСтроку(МногострочнаяСтр,СтрЧислоСтрок(МногострочнаяСтр));
    НачалоЧисла =  СтрЗаменить(Лев(МногострочнаяСтр,СтрДлина(МногострочнаяСтр)- СтрДлина(Хвост) - 1),Символы.ПС,"");
    Возврат (НачалоЧисла+"."+Хвост);
КонецФункции
67 vde69
 
19.09.14
14:24
то есть алгоритм такой

1. заполняем соответствие возможных ваинтов "формат"-"значение", если результат один - он и есть ответ

2. дальше ищем "форматы" в базе знаний, если есть совпадение - значит он и есть ответ

3. совпадения формата нет - спрашиваем пользователя....
68 PR
 
19.09.14
14:24
(65) Вот. Настоящий кодер на 20000 оклада :))
69 Garykom
 
гуру
19.09.14
14:27
(68) у мну оклад 35 килорублей, аж обидно стало ((
70 Garykom
 
гуру
19.09.14
14:31
(67) во 100% решение, только еще бы контекст учитывать, когда формат один а ответов нескоко )) т.е. не спрашивать лишний раз
71 Garykom
 
гуру
19.09.14
14:32
(70) т.е. банально расширить формат на не одно число а на набор чисел-строк (если список дают) или откуда вызывают к примеру ))
72 PR
 
19.09.14
14:33
(69) От того, что у тебя больше?
73 Зойч
 
19.09.14
14:33
(67) для каждой строки в базе хранить чило? база не лопнет?
74 Garykom
 
гуру
19.09.14
14:34
(72) нет, оттого что разница такая в окладе мелкая, не смотря на разницу в скиллах...
75 vde69
 
19.09.14
14:37
(73) в базе хранится только интерактивные ответы пользователя, то есть это обучающийся алгоритм, и в принцепе не так сложно реализовать.
76 PR
 
19.09.14
14:38
(74) Так это же с премией в 80% :))
77 Garykom
 
гуру
19.09.14
14:39
(76) тогда еще хуже, у мня ваще почти нету премий :((
78 Garykom
 
гуру
19.09.14
14:42
(75) не не, надо не так, сделать веб-сервис с техподдержкой девочек которые там сидят

типа вызываем функцию и она все делает сама (для пользователя-программиста)

- ну да некоторые долго думает, пока оператор на поддержке вебсервиса отработает  :))
79 MishaD
 
19.09.14
14:42
(65\8) Ну почему 20. Решение в соответствии с ТЗ, как раз на 200,000,00
80 PR
 
19.09.14
14:44
(79) Решение в соответствии с ТЗ не означает максимальную удовлетворенность клиента.
А вот получение денег максимальная удовлетворенность клиента означает.
81 MishaD
 
19.09.14
14:45
(80) Ну максимальной удовлетворенности клиента можно разными методами достичь
82 kosts
 
19.09.14
14:49

Функция ВсехавающаяФункцияПреобразованияСтрокиВЧисло(ЧислоСтрокой)
    
    Если ПустаяСтрока(ЧислоСтрокой) Тогда
        Возврат 0;
    Иначе
        ДлинаСтроки = СтрДлина(ЧислоСтрокой);
        Слева = Сред(ЧислоСтрокой, 1, ДлинаСтроки-1);
        Справа = Сред(ЧислоСтрокой, ДлинаСтроки);
        Если ЭтоЦифра(Справа) Тогда
            Число = Число(Справа) / 100;
            Возврат ВсехавающаяФункцияПреобразованияСтрокиВЧисло(Слева) * 10 + Число;
        Иначе
            Возврат ВсехавающаяФункцияПреобразованияСтрокиВЧисло(Слева);
        КонецЕсли;
    КонецЕсли;
    
КонецФункции
83 13_Mult
 
19.09.14
14:49
Я бы регулярками сделал если массив большой
а так вот на коленке:


Список = Новый СписокЗначений;
    Список.Добавить("1000000.01");
    Список.Добавить("1000000.01");
    Список.Добавить("1,000,000.01");
    Список.Добавить("1 000 000,01");
    Список.Добавить("1 000 000.01");
    Список.Добавить("1.000.000,01");
    Список.Добавить("1000000,01");
    Список.Добавить("1,000,000,01");
    Список.Добавить("1.000.000.01");
    Список.Добавить("1.000.000,000,01");
    
    Для Каждого Стр Из Список Цикл
        Точка = СтрЧислоВхождений(Стр.Значение, ".");
        Запятэ = СтрЧислоВхождений(Стр.Значение, ",");
        
        ч = СтрЗаменить(Стр.Значение, " ", "");
        
        Если Точка > 0 И Запятэ > 0 И Точка = Запятэ Тогда
            Сообщить("Не определить "+ ч);
        ИначеЕсли Точка = 0 И Запятэ = 0 Тогда
            Сообщить("Целое "+Число(СокрЛП(ч)));
        ИначеЕсли Точка = 1 И Запятэ > 1 Тогда
            Сообщить("Разделитель Точка "+Число(СтрЗаменить(СокрЛП(ч),"," ,"")));
        ИначеЕсли Запятэ = 1 И Точка > 1 Тогда
            Сообщить("Разделитель Запятая "+Число(СтрЗаменить(СтрЗаменить(СокрЛП(ч),"." ,""), ",",".")));
        ИначеЕсли Точка = 1 И Запятэ = 0 Тогда
            Сообщить("Разделитель Точка "+Число(СокрЛП(ч)));
        ИначеЕсли Точка = 0 И Запятэ = 1 Тогда
            Сообщить("Разделитель Запятая "+Число(СтрЗаменить(СокрЛП(ч),"," ,".")));
        ИначеЕсли Точка = 0 И Запятэ > 1 Тогда
            Сообщить("Целое "+Число(СтрЗаменить(СокрЛП(ч),"," ,"")));
        ИначеЕсли Точка > 1 И Запятэ = 0 Тогда
            Сообщить("Целое "+Число(СтрЗаменить(СокрЛП(ч),"." ,"")));
        Иначе
            Сообщить("Не определить "+ ч);
        КонецЕсли;
     КонецЦикла;
84 А4407-6Б
 
19.09.14
15:04

&НаКлиенте
Функция ПолучитьЧислоИзСтроки(Значение, Разделитель = Неопределено) Экспорт
    вернуть = Неопределено;
    Если Значение = Неопределено ИЛИ Значение = NULL Тогда
        Возврат Неопределено;
    КонецЕсли;
    
    целая = "";
    дробная = "";
    
    системный_разделитель = Сред(СокрЛП(1/2), 2, 1);
    альтерналива = ?(системный_разделитель = ".", ",", ".");
    был_системный_разделитель = ложь;
    
    Для шаг = 0 По СтрДлина(Значение) - 1 Цикл
        
        текущий_символ = Сред(Значение, СтрДлина(Значение) - шаг, 1);
        
        Если КодСимвола(текущий_символ) >= 48 И
             КодСимвола(текущий_символ) <= 57
        Тогда
            Если был_системный_разделитель Тогда
                целая = текущий_символ + целая;
            Иначе
                дробная = текущий_символ + дробная;
            КонецЕсли;
        Иначе
            Если был_системный_разделитель = Ложь И
                (текущий_символ = системный_разделитель ИЛИ текущий_символ = альтерналива)
            Тогда
                Если СтрДлина(Значение) = 1 Тогда
                    Возврат Неопределено;
                КонецЕсли;
                
                был_системный_разделитель = Истина;
            Иначе
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    вернуть = целая + системный_разделитель + дробная;
    Если ЭтоЧисло(вернуть) Тогда
        вернуть = Число(вернуть);
    КонецЕсли;
    
    Возврат вернуть;
КонецФункции

&НаКлиенте
Функция ЭтоЧисло(Значение, ПроверятьРазделительРазрядов = Истина, Целое = Ложь) Экспорт
    вернуть = Истина;
    Если Значение = Неопределено ИЛИ Значение = NULL Тогда
        Возврат ложь;
    КонецЕсли;
    
    системный_разделитель = Сред(СокрЛП(1/2), 2, 1);
    был_системный_разделитель = ложь;
    
    Для шаг = 1 По СтрДлина(Значение) Цикл
        текущий_символ = Сред(Значение, шаг, 1);
        
        Если ПроверятьРазделительРазрядов И текущий_символ = Символ(160) Тогда
            Продолжить;    
        КонецЕсли;
        
        Если КодСимвола(текущий_символ) >= 48 И
             КодСимвола(текущий_символ) <= 57
            
        Тогда
        Иначе
            Если текущий_символ = системный_разделитель Тогда
                Если Целое Тогда
                    вернуть = Ложь;
                    Прервать;
                ИначеЕсли был_системный_разделитель Тогда
                    вернуть = Ложь;
                    Прервать;
                ИначеЕсли СтрДлина(Значение) = 1 Тогда
                    вернуть = Ложь;
                    Прервать;
                КонецЕсли;
                был_системный_разделитель = Истина;
            Иначе
                вернуть = Ложь;
                Прервать;
            КонецЕсли;
        КонецЕсли;
    КонецЦикла;
    
    Возврат вернуть;
КонецФункции

85 samozvanec
 
19.09.14
15:26
пятница удалась)

функция ВсемогущаяФункция(Стр)

Циферки = "0123456789";
НовСтр = "";

Для Каждого СимволСтр Из Стр Цикл
    Если НЕ Найти(СимволСтр, Циферки) = Неопределено Тогда
        НовСтр = НовСтр + СимволСтр;
    КонецЕсли;
КонецЦикла;

Число = Число(НовСтр);
ДлинаСтр = СтрДлина(Стр);
Если ДлинаСтр > 3 B Найти(Сред(Стр, ДлинаСтр-2, 1), Циферки) = Неопределено Тогда
Число = Число / 100;
КонецЕсли;

Возврат ?(Лев(Стр, 1) = "-", -Число, Число);
86 samozvanec
 
19.09.14
15:29
(80) еще больше получение денег означает удовлетворенность программиста)
87 cathode
 
19.09.14
16:36
(0) Еще давно, где-то году в 2006, я делал на 8.0 функцию преобразования строки в число, максимально совместимую с той, которая используется в 7.7. Сейчас посмотрел ее на указанных данных, работает. Чуть модифицировал для дробных/недробных с одинаковым разделителем десятичной части и разделителем триад.


// Преобразует строковое представление числа в число.
//
// Версия: 2.1.
//
// Параметры
//  Парам - Строка - Выражение для преобразования.
//  Пусто - Неопределенный - Представление пустого значения (0 или пустая строка).
//  Ошибка - Неопределенный - Представление значения при ошибке преобразования.
//
// Возвращаемое значение:
//  Число - переданное значение в виде числа. Если переданное значение пусто
//  или нулевое, возвращает значение параметра Пусто. В случае ошибки
//  распознавания, возвращает значение параметра Ошибка.
//
Функция СтрокаВЧисло(Знач Строка, Знач Пусто = 0, Знач Ошибка = 0) Экспорт
    
    Перем Результат, НомерСимвола, МаксНомерСимвола, ТекущийСимвол, Алфавит
        , Отрицательное, ЕстьДробнаяЧасть;
        
    Если Не ПустаяСтрока(Строка) Тогда
        Строка = СокрЛП(Строка);
        МаксНомерСимвола = СтрДлина(Строка);
        
        // Определяем знак числа и удаляем его из исходной строки.
        ТекущийСимвол = Лев(Строка, 1);
        Алфавит = "+-";
        Если Найти(Алфавит, ТекущийСимвол) > 0 Тогда
            Строка = Сред(Строка, 2);
            МаксНомерСимвола = МаксНомерСимвола - 1;
            Отрицательное = (ТекущийСимвол = "-");
        Иначе
            Отрицательное = Ложь;
        КонецЕсли;
        
        // С начала исходной строки определяем последовательность максимальной длины,
        // конторая может быть распознана как число.
        НомерСимвола = 1;
        Алфавит = "0123456789 .," + Символы.НПП;
        Пока НомерСимвола <= МаксНомерСимвола Цикл
            ТекущийСимвол = Сред(Строка, НомерСимвола, 1);
            Если Найти(Алфавит, ТекущийСимвол) = 0 Тогда
                Прервать;
            КонецЕсли;
            НомерСимвола = НомерСимвола + 1;
        КонецЦикла;
        
        // Удаляем правую часть строки, которая не участвует в распознавании.
        Если НомерСимвола <= МаксНомерСимвола Тогда
            Строка = Лев(Строка, НомерСимвола - 1);
            МаксНомерСимвола = НомерСимвола - 1;
        КонецЕсли;
        
        Если МаксНомерСимвола > 0 Тогда
            // Очищаем строку слева и справа от пробельных символов.
            Алфавит = " " + Символы.НПП;
            Пока Найти(Алфавит, Лев(Строка, 1)) > 0 Цикл
                Строка = Сред(Строка, 2);
                МаксНомерСимвола = МаксНомерСимвола - 1;
            КонецЦикла;
            Пока Найти(Алфавит, Прав(Строка, 1)) > 0 Цикл
                Строка = Лев(Строка, МаксНомерСимвола - 1);
                МаксНомерСимвола = МаксНомерСимвола - 1;
            КонецЦикла;
            
            // Определяем максимальное количество цифр справа, которые могут быть
            // распознаны как дробная часть
            НомерСимвола = МаксНомерСимвола;
            Алфавит = "012345679";
            Пока НомерСимвола >= 1 Цикл
                ТекущийСимвол = Сред(Строка, НомерСимвола, 1);
                Если Найти(Алфавит, ТекущийСимвол) = 0 Тогда
                    Прервать;
                КонецЕсли;
                НомерСимвола = НомерСимвола - 1;
            КонецЦикла;
            
            Если НомерСимвола > 0 Тогда
                // Для строки "123,456": "456" - дробная часть
                // Для строки "1,123,456": "456" - последняя триада целой части
                Если Найти(".,", ТекущийСимвол) > 0
                    И Не (МаксНомерСимвола - НомерСимвола = 3
                        И МаксНомерСимвола >= 9
                        И Сред(Строка, НомерСимвола - 4, 1) = ТекущийСимвол) Тогда
                    Строка = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Лев(Строка, НомерСимвола - 1), ".", ""), ",", ""), " ", ""), Символы.НПП, "") + "." + Сред(Строка, НомерСимвола + 1);
                Иначе
                    Строка = СтрЗаменить(СтрЗаменить(СтрЗаменить(СтрЗаменить(Строка, ".", ""), ",", ""), " ", ""), Символы.НПП, "");
                КонецЕсли;
            КонецЕсли;
            
            Строка = ?(Отрицательное, "-", "") + Строка;
        КонецЕсли;
    КонецЕсли;
    
    Если ПустаяСтрока(Строка) Тогда
        Результат = Пусто;
    Иначе
        Попытка
            Результат = Число(Строка);
        Исключение
            Результат = Ошибка;
        КонецПопытки;
    КонецЕсли;
    
    Возврат Результат;

КонецФункции // СтрокаВЧисло()


Достоинства:
  * По умолчанию все нечисла превращаются в 0 (как в 7.7)
  * Отбрасывается правая нечисловая часть, типа "123.45 р." (как в 7.7)
  * Корректно обрабатывает все варианты из (0), т.е. почти всеядная.

Недостатки:
  * Будет пытаться преобразовать в число даже нечисловые значения, содержащие цифры. Например, IP-адреса ("192.168.100.123" преобразуется в 192168100,123).
  * Не проверяет консистентность группировки разрядов ("356 23 1234" преобразуется в 356231234).

Может, кому нужна будет...