O valor pode ser um número negativo: regras de negócios separadas e regras de tipo
Escreva todos os campos de valor como `minimum: 0`, o que parece muito rigoroso superficialmente, mas bloqueará o registro normal de reembolso. Se o valor foi extraído para um número e se números negativos são permitidos neste negócio são duas questões. Você deve primeiro confirmar o significado do documento e depois escrever as regras de escopo.
Se você estiver fazendo uma extração estruturada de pedidos, faturas ou documentos financeiros, o campo de valor costuma ser o local mais sujeito a erros. Muitas pessoas escreverão todos os valores como minimum: 0, o que parece muito rigoroso, mas os registros normais de reembolso serão rejeitados por causa disso.
Se o valor foi extraído para um número e se números negativos são permitidos neste negócio são duas questões diferentes. Primeiro confirme o que representa o sinal negativo no documento e, em seguida, determine as regras de intervalo, de modo a garantir que o tipo esteja correto sem danificar acidentalmente dados razoáveis.
Este artigo utiliza amostras sintéticas para demonstrar o método de processamento. O código foi verificado com exemplos em ambiente isolado; isso não representa uma garantia de todos os arquivos reais ou do desempenho do produto. Antes de processar documentos importantes, guarde os originais e revise-os de acordo com os limites e itens de aceitação do texto.
O valor pode ser negativo? Conclusão de uma frase
Se o valor pode ser negativo depende do acordo da empresa, e não do tipo de campo em si. Defina primeiro o significado do sinal negativo e depois deixe o tipo determinar as restrições.
| sua situação | Práticas recomendadas | razão |
|---|---|---|
| Os reembolsos no acordo são expressos como valores negativos | O campo cobrança é restrito a valores não negativos, sendo permitidos valores negativos para reembolsos. | Símbolos são semântica de negócios e não podem ter tamanho único |
| O sistema usa "valor positivo mais tipo de reembolso" | O valor é uniformemente positivo e o campo de tipo é usado para distinguir reembolsos | Ambos os métodos podem ser estabelecidos, mas apenas um pode ser selecionado para a mesma interface. |
| É necessária uma quantia estritamente positiva | Use exclusiveMinimum em vez de minimum: 0 | minimum contém limites e passará valores zero |
| Sinais negativos nas fontes podem estar faltando ou mal colocados | Salve o fragmento de texto original e revise-o manualmente. Não tome diretamente o valor absoluto. | A autocorreção pode mascarar erros reais |
Primeiro defina o que o sinal negativo representa
O acordo de síntese neste artigo estipula que os encargos ordinários não são negativos e os reembolsos são expressos em montantes negativos. Os sistemas reais também podem usar um método de contabilidade de "valor positivo mais tipo de reembolso". Ambos os métodos podem ser estabelecidos, mas você não pode confiar que os leitores adivinharão na mesma interface.
O limite do ponto zero aqui é um protocolo de amostra e não um padrão unificado no setor financeiro.
Deixe o tipo determinar as restrições
minimum do esquema JSON contém limites, exclusiveMinimum não contém limites. Se o requisito de negócio for estritamente positivo, minimum: 0 não poderá ser usado.
Liste os cenários que permitem valores zero antes de selecionar palavras-chave para evitar interpretar mal itens gratuitos, baixas ou estimativas como erros.
from jsonschema import Draft202012Validator
schema = {
"type": "object", "required": ["kind", "amount"],
"additionalProperties": False,
"properties": {"kind": {"enum": ["charge", "refund"]},
"amount": {"type": "number"}},
"allOf": [
{"if": {"properties": {"kind": {"const": "charge"}}},
"then": {"properties": {"amount": {"minimum": 0}}}},
{"if": {"properties": {"kind": {"const": "refund"}}},
"then": {"properties": {"amount": {"exclusiveMaximum": 0}}}}
]
}
v = Draft202012Validator(schema)
valid = lambda x: not list(v.iter_errors(x))
assert valid({"kind": "charge", "amount": 0})
assert valid({"kind": "refund", "amount": -12.5})
assert not valid({"kind": "refund", "amount": 12.5})
assert not valid({"kind": "charge", "amount": True})
assert not valid({"amount": 12.5})
O exemplo depende de jsonschema e é verificado de acordo com o Draft 2020-12. Não realiza conversão de moeda, nem verifica a relação entre itens e totais.
Os cálculos de moeda exigem precisão clara e estratégias de arredondamento. Só porque os valores passam na verificação do esquema, você não pode usar números de ponto flutuante para acumular à vontade.
Ao relatar um erro, você precisa indicar o contexto de negócios
Quando a verificação falha, a mensagem de erro deve ajudar as pessoas a determinar a causa, em vez de apenas indicar"ilegal".
| observar | O processamento aqui | Ainda preciso verificar |
|---|---|---|
| O reembolso é positivo | rejeitar | O símbolo está faltando ou a fonte usa outro protocolo? |
| A cobrança é zero | aceitar estrutura | É um projeto gratuito? |
| O valor é uma string | tipo de rejeição | Sinal de posição de milhares, moeda e regras decimais |
| Tipo ausente | rejeitar | Adivinhe o tipo de documento sem depender do sinal de valor |
Não use valores absolutos automáticos para encobrir erros
OCR com travessões ausentes, sinais negativos em movimento durante a tradução ou empresas que usam convenções de sinais opostas podem se manifestar como a mesma anomalia.
Ligar diretamente paraabs() eliminaria importantes pistas de diagnóstico. Uma abordagem mais segura é salvar os fragmentos de texto originais, números de página e strings antes de analisar e, em seguida, decidir se deseja extrair novamente ou revisar manualmente.
Verifique a quantidade e o tipo juntos na hora da entrega
Ao usar OmniDoc (portal de produtos) para processar documentos contendo valores, você pode usar esta tabela de regras como parte da aceitação pós-tradução: não apenas verifique se os números foram perdidos, mas também se o contexto de reembolsos, créditos, etc.
As ferramentas podem ajudar a completar a tradução, mas o acordo de valor ainda deve estar claro para o lado comercial.
📊 Comparação principal
| prática | Significado do sinal negativo | Adequado para a cena | Observação |
|---|---|---|---|
| Reembolso com valor negativo | Um sinal negativo indica um reembolso | O acordo concordou em usar símbolos para distinguir direções | O campo de cobrança deve ser restrito a valores não negativos e o campo de reembolso permite valores negativos. |
| Valor positivo mais tipo de reembolso | O sinal negativo não tem significado comercial | O sistema distingue os reembolsos por tipo de campo | O valor é uniformemente positivo e o tipo deve ser verificado ao mesmo tempo. |
minimum: 0 | Contém valor zero | Valores que permitem valores zero | Irá liberar valores zero, não adequados para cenários estritamente positivos |
exclusiveMinimum: 0 | Não contém valor zero | É estritamente necessário que seja um valor positivo | Necessidade de confirmar que itens gratuitos ou estornos não serão rejeitados por engano |
🎯 Qual método é adequado para você?
Se o seu contrato usar um valor negativo para indicar um reembolso
- Defina restrições não negativas para o campo de cobrança, permita valores negativos para o campo de reembolso e escreva o acordo no documento.
Se o seu sistema usa "valor positivo mais tipo de reembolso"
- O campo valor deve ser uniformemente positivo e o campo tipo deve ser verificado ao mesmo tempo para evitar julgar a natureza do documento apenas olhando os números.
Se o valor da necessidade de negócios for estritamente positivo
- Use
exclusiveMinimume verifique primeiro se itens gratuitos, descontos e estimativas não serão rejeitados por engano.
Se o sinal negativo do arquivo de origem for perdido
- Mantenha os fragmentos de texto originais, números de páginas e sequências pré-analisadas e revise-os manualmente antes de inseri-los no banco de dados. Não tome diretamente o valor absoluto.
❓ Perguntas frequentes (FAQ)
1. Qual é a diferença entre minimum e exclusiveMinimum?
minimum contém valores limite, exclusiveMinimum não contém valores limite. Se o requisito de negócio for estritamente positivo, minimum: 0 não poderá ser usado.
2. Se passar na verificação do esquema, o valor estará correto?
incerto. O exemplo não realiza conversão de moeda, nem verifica a relação entre itens e totais; os cálculos monetários também exigem estratégias claras de precisão e arredondamento.
3. Por que o valor não pode ser acumulado diretamente usando números de ponto flutuante?
Os cálculos de moeda exigem precisão clara e estratégias de arredondamento. Números de ponto flutuante não podem ser usados para acumular aleatoriamente apenas porque os valores passam na verificação do esquema.
4. Ao encontrar uma exceção de sinal negativo, você pode obter diretamente o valor absoluto?
Não recomendado. Palavras faltantes no OCR, sinais negativos em movimento na tradução ou convenções de símbolos comerciais diferentes podem causar anormalidades. A tomada direta do valor absoluto eliminará as pistas de diagnóstico.
📝 Resumo
A chave para o campo de valor é primeiro confirmar o que o sinal negativo representa e, em seguida, deixar o tipo determinar as restrições. Ao separar regras de negócios e regras de tipo, você não pode rejeitar reembolsos por engano nem perder erros reais.
Experimente agora: carregue o documento para iniciar a tradução, mantendo o layout original
Referências: Restrições numéricas do esquema JSON


