zNumero
This commit is contained in:
parent
1e219ad657
commit
7e06927ca6
8 changed files with 119 additions and 4 deletions
|
|
@ -21,3 +21,4 @@ export * from "./uuid"
|
|||
export * from "./variaveisComuns"
|
||||
export * from "./zCoordenadas"
|
||||
export * from "./zDocumento"
|
||||
export * from "./zodCustomizados"
|
||||
|
|
|
|||
39
src/zodCustomizados.ts
Normal file
39
src/zodCustomizados.ts
Normal file
|
|
@ -0,0 +1,39 @@
|
|||
import z from "zod"
|
||||
|
||||
const zPreprocessarNumero = (p: unknown) => {
|
||||
if (typeof p === "number") return p
|
||||
if (typeof p !== "string") return p
|
||||
|
||||
let p2 = p
|
||||
|
||||
if (p2.includes(",")) {
|
||||
// ponto de milhar → remove; vírgula decimal → troca por ponto
|
||||
p2 = p2.replace(/\./g, "").replace(",", ".")
|
||||
}
|
||||
|
||||
// remove tudo que não seja dígito ou ponto decimal
|
||||
p2 = p2.replace(/[^0-9.]/g, "")
|
||||
|
||||
if (p2 == "") return null
|
||||
|
||||
return Number(p2)
|
||||
}
|
||||
|
||||
/**
|
||||
* Schema numérico que aceita strings legadas e normaliza para `number`.
|
||||
*
|
||||
* O campo **é** um número. O `preprocess` resolve compatibilidade com dados
|
||||
* antigos onde o frontend enviava strings formatadas (BR ou monetária).
|
||||
*
|
||||
* Formatos de entrada aceitos:
|
||||
* - `10` → number direto
|
||||
* - `10.1` → ponto decimal
|
||||
* - `10,1` → vírgula decimal (BR)
|
||||
* - `1.000,1` → milhar com ponto + vírgula decimal (BR)
|
||||
* - `R$ 10,01` → prefixo monetário legado
|
||||
*/
|
||||
export const zNumero = z.preprocess(zPreprocessarNumero, z.number())
|
||||
|
||||
export const zNumeroPositivo = z.preprocess(zPreprocessarNumero, z.number().positive())
|
||||
|
||||
export const zNumeroInteiro = z.preprocess(zPreprocessarNumero, z.number().int())
|
||||
Loading…
Add table
Add a link
Reference in a new issue