Мне нужна помощь для округления чисел для конвертации валюты в текстовом файле с использованием notepad ++ и плагина скрипта Python - PullRequest
1 голос
/ 09 мая 2019

Было бы неплохо, если бы кто-то мне помог.

У меня есть текстовые файлы, которые выглядят так:

#Zsdfgsdqfq
#A100,56
#Zjtdhsdfg
#Zadsdf
#B12,53
#Zdwfgs
#C10,00
#Zdsfgdfg
#D40,00

В файле #A, #B, #C и D #числа, которые мне нужно разделить на 6,55957 Это результат, который я хочу:

#A15,33
#Zjtdhsdfg
#Zadsdf
#B1,91
#Zdwfgs
#C1,52
#Zdsfgdfg
#D6,10

Я нашел это полезное обсуждение: Блокнот ++ Как умножить числа на массовую замену?

Так что я использовал плагин скрипта Python в Блокноте ++

Я не могу понять, как управлять десятичными числами и запятой, используемой для десятичного разделителя.

Я обнаружилЯ могу удалить все запятые, а затем разделить результат на 100, и я смогу найти и заменить, чтобы заменить точки запятыми в полученном файле.

Вот мой сценарий, основанный на том, что я прочитал в связанном обсуждении:

def multiply_number_in_context(match):
    return "{0}{1}".format(match.group(1), str(int(match.group(2))/655.957)) # thank you Wiktor Stribiżew to explain me how to get rid of this : ,''

editor.rereplace(r'(\#A)(\d+)', multiply_number_in_context)
editor.rereplace(r'(\#B)(\d+)', multiply_number_in_context)
editor.rereplace(r'(\#C)(\d+)', multiply_number_in_context)
editor.rereplace(r'(\#D)(\d+)', multiply_number_in_context)

Вот результат:

#Zsdfgsdqfq
#A15.33027317339399
#Zjtdhsdfg
#Zadsdf
#B1.910186185984752
#Zdwfgs
#C1.524490172374104
#Zdsfgdfg
#D6.097960689496415

Это работает, но теперь мне нужно округлить результаты с двумя десятичными знаками.#A должно быть 15,33, а #D должно быть 6,10

Кажется, способ использует круглую (x, 2) вещь, но я не могу понять, как это сделать.

Iпопытался изменить мой сценарий с помощью таких вещей:

return "{0}{1}{2}".format(match.group(1), str(round(int(match.group(2))/655.957), '')), 2) 

или изменить сценарий так, чтобы он округлял числа вместо умножения, но безуспешно у меня есть ошибки синтаксиса и тому подобное.

Было бы любезно, если бы кто-то мог улучшить мой сценарий, чтобы он округлял результат или давал мне другой сценарий, который округляет мои результаты.

Я не хочу изучать программирование, я просто ищу решение.

Спасибо.

1 Ответ

0 голосов
/ 09 мая 2019

Используйте следующий фиксированный скрипт:

def multiply_number_in_context(match):
    return "{0:.2f}".format(float(match.group(0).replace(',', '.'))*100.0/655.957).replace(".",",")

editor.rereplace(r'(?<=#[A-Z])\d+(?:,\d+)?', multiply_number_in_context)

См. Демоверсию regex .Детали:

  • (?<=#[A-Z]) - положительный вид сзади, который соответствует местоположению, непосредственно предшествующему #, а затем любой прописной букве ASCII (измените на [A-D], чтобы соответствовать только A, B, C или D)
  • \d+ - 1+ цифр
  • (?:,\d+)? - необязательная подстрока, которая соответствует
    • , - запятая
    • \d+ - 1 или более цифр.

Результаты:

enter image description here

Примечания

  • match.group(0).replace(',', '.') заменяет запятую точкой для упрощения вычислений
  • float(...)*100.0/655.957 - найденное число приводится к числу с плавающей точкой, умноженное на100 и делится на 655,957
  • "{0:.2f}".format(...) - форматирует округленный результат с плавающей точкой
  • .replace(".",",") - переводит десятичный разделитель в ,.
...