|
Всехавающая функция преобразования строки в число | ☑ | ||
---|---|---|---|---|
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
|
Если не пытаться сделать именно в десять строк, а расписать код понятнее, то вот :))
|
|||
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 знаков после запятой или целого
|
|||
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) В соответствии с ТЗ:
|
|||
66
shpioleg
19.09.14
✎
14:23
|
Для дробных с пофиг сколько знаков после запятой
|
|||
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
|
|
|||
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
|
|
|||
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. Сейчас посмотрел ее на указанных данных, работает. Чуть модифицировал для дробных/недробных с одинаковым разделителем десятичной части и разделителем триад.
Достоинства: * По умолчанию все нечисла превращаются в 0 (как в 7.7) * Отбрасывается правая нечисловая часть, типа "123.45 р." (как в 7.7) * Корректно обрабатывает все варианты из (0), т.е. почти всеядная. Недостатки: * Будет пытаться преобразовать в число даже нечисловые значения, содержащие цифры. Например, IP-адреса ("192.168.100.123" преобразуется в 192168100,123). * Не проверяет консистентность группировки разрядов ("356 23 1234" преобразуется в 356231234). Может, кому нужна будет... |
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |