StrZero
Converte numero em string com zeros a esquerda (zero-padding). Indispensavel pra gerar codigos formatados (000123) e chaves de busca DBSeek.
Assinatura: StrZero(nNumero, nTam, [nDec]) -> cString
Retorna: Character
StrZero e o "pad zero a esquerda" do AdvPL. Recebe numero, devolve string com tamanho fixo preenchida com zeros. E a forma idiomatica de gerar codigos formatados.
Sintaxe
StrZero(nNumero, nTam, nDec) --> cString
// nNumero = valor numerico
// nTam = tamanho total (incluindo decimais e ponto)
// nDec = casas decimais (opcional, default 0)
Exemplos
StrZero(123, 6) // "000123"
StrZero(123, 10) // "0000000123"
StrZero(1, 4) // "0001"
StrZero(999999, 6) // "999999"
StrZero(1234567, 6) // "234567" (trunca esquerda!)
// Com decimais
StrZero(99.9, 7, 2) // "0099.90"
StrZero(1.5, 5, 2) // "01.50"
// Negativo
StrZero(-5, 4) // "-005"
Casos praticos
1. Gerar codigo sequencial
// Proximo codigo de produto (formato P000001)
Static Function _ProxCod()
Local nUlt := 0
SB1->(DBSetOrder(1))
SB1->(DBGoBottom())
nUlt := Val(SubStr(SB1->B1_COD, 2)) // ignora prefixo "P"
Return "P" + StrZero(nUlt + 1, 5)
// "P00001", "P00002", "P00003"...
2. Chave de busca DBSeek
// Tamanho da chave fixo conforme SX3
nCodigo := 42
cChave := xFilial("SA1") + StrZero(nCodigo, TamSx3("A1_COD")[1])
If SA1->(DBSeek(cChave))
cNome := SA1->A1_NOME
EndIf
3. Numerador de NF
// Proxima NF — formato 000000123
nProx := GetSXENum("SF2", "F2_DOC")
cNumNF := StrZero(Val(nProx), 9)
ConfirmSX8()
4. Codigo composto (filial + sequencial)
cCod := cFilAnt + "/" + StrZero(nSeq, 6)
// "01/000042"
Pegadinhas
- Numero maior que nTam trunca pela esquerda (perde digitos!) — sempre dimensione nTam pra caber o maximo esperado.
- Negativo conta o sinal —
StrZero(-5, 4)= "-005" (sinal ocupa posicao). - Decimais incluem ponto —
StrZero(9.9, 5, 2)= "09.90" (5 chars: 0+9+.+9+0). - Use TamSx3() em vez de hardcoded — campo pode ter tamanho diferente entre projetos.
- Pra string ja formatada (concatenar codigo), use
PadL(cStr, nTam, "0").
Comparacao com PadL
// StrZero — entrada numerica
StrZero(42, 6) // "000042"
// PadL — entrada string (com chr customizado)
PadL("42", 6, "0") // "000042"
PadL("AB", 6, "0") // "0000AB"
PadL("AB", 6, "*") // "****AB"
Parâmetros
| Nome | Tipo | Obrigatório | Descrição |
|---|---|---|---|
nNumero | Numeric | sim | Valor numerico. |
nTam | Numeric | sim | Tamanho total da string resultante. |
nDec | Numeric | não | Casas decimais (default 0). |