Количество переводов не маленькое, но единица теряется: проверку следует разделить на два уровня

В этой статье предлагается стратегия иерархической проверки, позволяющая решить проблему сопоставления чисел суммы с единицами измерения при принятии перевода. С помощью decimal модуля стандартной библиотеки Python показано, как точно анализировать и сравнивать значения сумм и избегать ловушек точности с плавающей запятой; он также определяет границы ответственности за автоматическую проверку кода и ручную семантическую проверку, а также объединяет OmniDoc для иллюстрации практического пути приемки перевода документов.

Цифры в переводе вроде бы не пропали, но единицы могли быть незаметно потеряны. Если суммы или количества в котировках, заявлениях и технических данных неверны, это повлияет на фактические последствия для бизнеса, поэтому цифры необходимо проверять индивидуально перед поставкой.

Эта статья написана для тех, кто отвечает за прием переведенных документов, особенно для тех, кто часто имеет дело с котировками, финансовыми отчетами и техническими паспортами. В статье объясняется, почему 1,234.50 в переводе может стать 1.234,50, как сначала объявить правила ввода, а затем сравнивать значения и какие решения все равно придется делать вручную. После прочтения можно построить набор двухуровневых проверок: за форматы и значения отвечает автоматизированный код, а за семантику и бизнес-поля — люди.

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

##Количество переводов не маленькое, как это принять? Вывод в одно предложение

Для числовой проверки сначала необходимо объявить правила ввода, а затем сравнить нормализованные значения. Валюта и единица измерения сохраняются как независимые поля.

Твоя ситуацияРекомендуемые практикипричина
Та же стоимость, другая валютаПроверьте, не был ли изменен тег валютыНе следует считать эквивалентным
Формат не соответствует заявлениюПроверьте исходную локаль или процесс извлечения.Не все знаки препинания должны быть безусловно удалены
Отрицательный знак исчезает.Объединение проверки исходного текста и контекста переводаАбсолютные значения не должны приниматься автоматически
Сниженная точностьРаунд и запись по правиламРазличия не следует игнорировать без разбора

Сначала объявите правила ввода

1,234.50 и 1.234,50 соответственно обозначают одинаковые или разные количества на таможне разных регионов. Без предварительного указания того, какой формат использовать, программа не сможет определить, верны ли переведенные числа.

Обрабатывает только два явных формата

В этой статье рассматриваются только следующие два формата:

  • Запятая тысячи, десятичная точка: например 1,234.50.
  • Точка тысяч, десятичная запятая: например 1.234,50.

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

Сначала проверьте формат, затем выполните десятичное преобразование

Строка сначала проверяется на соответствие объявленному формату, а затем после ее передачи преобразуется в десятичный.

import re
from decimal import Decimal

def amount(text, style):
    rules = {
        "comma_group": (r"-?(?:[0-9]{1,3}(?:,[0-9]{3})+|[0-9]+)(?:\.[0-9]+)?", ",", "."),
        "dot_group": (r"-?(?:[0-9]{1,3}(?:\.[0-9]{3})+|[0-9]+)(?:,[0-9]+)?", ".", ",")
    }
    if style not in rules:
        raise ValueError("unknown number convention")
    pattern, grouping, decimal = rules[style]
    if re.fullmatch(pattern, text) is None:
        raise ValueError("number does not match declared convention")
    return Decimal(text.replace(grouping, "").replace(decimal, "."))

assert amount("1,234.50", "comma_group") == amount("1.234,50", "dot_group")
assert amount("-12.50", "comma_group") == Decimal("-12.50")
assert (amount("12.50", "comma_group"), "USD") != (amount("12.50", "comma_group"), "EUR")
for bad in ["12,34.50", "1,234.50 USD", "NaN"]:
    try:
        amount(bad, "comma_group")
    except ValueError:
        pass
    else:
        raise AssertionError("invalid number accepted")

Одних и тех же значений недостаточно

Этот код получает строку суммы, которая была позиционирована, и не находит сумму автоматически в каком-либо документе. При позиционировании полей следует сохранять метку, валюту и местоположение источника. То же число, но измененное с килограммов на фунты или общую цену на цену за единицу, не является корректной проверкой.

Сравнить результатыследует проверитьне должно выполняться автоматически
Та же стоимость, другая валютаБыла ли изменена валютная маркаПо умолчанию рассматривается как эквивалент
Формат не соответствует заявлениюИсходный регион или ошибка извлеченияБезоговорочно удалить все знаки препинания
Отрицательный знак исчезает.Исходный текст и контекст переводаАвтоматически принимать абсолютное значение
Снижение точностиОкруглять ли по правиламИгнорировать все различия

Десятичное число решает только часть проблемы

Decimal поможет вам в этом

  • Избегайте некоторых ошибок представления двоичных чисел с плавающей запятой.
  • Базируйте численные сравнения на явных нормализованных результатах.

Decimal не сможет сделать это за вас

  • Выберите правила округления
  • Объясните сумму налога.
  • Выполнить конвертацию обменного курса

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

Числа в файлах перевода заслуживают отдельного признания

При использовании OmniDoc (портал продуктов) для обработки котировок, отчетов или технических данных вы можете принять их в следующем порядке:

  1. Сначала отсортируйте элементы проверки по сумме и единице измерения и перечислите бизнес-поля, соответствующие каждому числу.
  2. Сравните элементы проверки с рукописью перевода один за другим и запишите различия в формате, валюте, отрицательном знаке и точности.
  3. Для подозрительных предметов вернитесь к исходному тексту, чтобы подтвердить, какую сферу деятельности он представляет.

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

Источники: Python decimal.

📊 Сравнение ядра

ФорматПримерМетод обработки
запятая тысячи, десятичная точка1,234.50В пределах области видимости, анализируется в соответствии с правилами объявления.
Точка, тысячи, запятая, десятичная дробь1.234,50В пределах области видимости, анализируется в соответствии с правилами объявления.
Пространственные тысячи, скобки для отрицательных чисел, научная записьНе применимо к этой статьеНе входит в рамки, отказывайтесь гадать, если исходные правила неизвестны.

🎯 Какой метод подходит вам?

Если вы обрабатываете котировки или отчеты

Сначала разберите проверочные позиции суммы и единицы, а затем сверьте их поочередно с рукописью перевода.

Если в вашем файле используются другие методы записи чисел

В этой статье не рассматриваются пробелы в тысячах, отрицательные числа в квадратных скобках или научные обозначения. Сначала подтвердите исходные правила, не позволяйте программе догадываться.

Если вам нужно выполнить конвертацию валютного курса

Decimal не выполнит преобразование за вас, запишите значения до и после преобразования, а также причину в списке.

❓ Часто задаваемые вопросы (FAQ)

1. Почему бы не сравнить суммы напрямую, используя числа с плавающей запятой?

Использование Decimal позволяет избежать некоторых ошибок представления двоичных чисел с плавающей запятой, поэтому оно больше подходит для числовых сравнений.

2. Если числа одинаковые, но валюты разные, можно ли их считать эквивалентными?

По умолчанию не должно считаться эквивалентным. Сначала проверьте, не был ли изменен тег валюты.

3. Может ли абсолютное значение автоматически приниматься при исчезновении знака минус?

Абсолютное значение не должно приниматься автоматически, а должно проверяться в сочетании с контекстом исходного текста и перевода.

4. Может ли код автоматически найти сумму из любого документа?

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

📝 Резюме

Ключом к проверке чисел является сначала объявление правил формата, затем сравнение нормализованных значений и сохранение валюты и единиц измерения как независимых полей. Автоматизированная проверка используется для обнаружения сомнительных моментов, а деловой смысл еще необходимо подтвердить, вернувшись к исходному тексту.

Попробуйте сейчас: загрузите документ, чтобы начать перевод, сохранив исходный макет.

Обновлено 2026-11-14