У меня есть этот фрагмент текста:
(-1.000mm 1.000mm)
(-0.500mm 0.800mm)
(0.500mm 1.200mm)
(1.000mm 1.000mm)
(0.800mm 0.500mm)
(1.200mm -0.500mm)
(1.000mm -1.000mm)
(0.500mm -0.800mm)
(-0.500mm -1.200mm)
(-1.000mm -1.000mm)
(-0.800mm -0.500mm)
(-1.200mm 0.500mm)
(-1.000mm 1.000mm)
Я хотел бы умножить все эти числа на 0,95 (и другие числа). Я пробовал:
:%s/[0-9.]*mm/\=submatch(0)*0.95/g
но результат:
(-0.95 0.95)
(-0.0 0.0)
(0.0 0.95)
(0.95 0.95)
(0.0 0.0)
(0.95 -0.0)
(0.95 -0.95)
(0.0 -0.0)
(-0.0 -0.95)
(-0.95 -0.95)
(-0.0 -0.0)
(-0.95 0.0)
(-0.95 0.95)
Я, должно быть, делаю что-то не так с группировкой или что-то в этом роде, потому что, помимо того, что большинство чисел превращается в 0,0, mm
отпадает.
Проблема в том, что ваши плавающие строки при умножении приводятся к целым числам, а не к числам с плавающей запятой. Вторая проблема заключается в том, что вы заменяете mm:
:%s/[0-9.]*\zemm/\=str2float(submatch(0))*0.95/g
Функция str2float
превращает строку в число с плавающей точкой. Специальная последовательность регулярного выражения \ze
«соответствует в любой позиции и устанавливает конец совпадения там».
Результат:
(-0.95mm 0.95mm)
(-0.475mm 0.76mm)
(0.475mm 1.14mm)
(0.95mm 0.95mm)
(0.76mm 0.475mm)
(1.14mm -0.475mm)
(0.95mm -0.95mm)
(0.475mm -0.76mm)
(-0.475mm -1.14mm)
(-0.95mm -0.95mm)
(-0.76mm -0.475mm)
(-1.14mm 0.475mm)
(-0.95mm 0.95mm)