O código saiu zoado, segue:
String ncompleto = "Marcelo Coelho Ribeiro Machado de Assis"
String[] nomes = ncompleto.split()
int tamanho = nomes.length
String abv = nomes[0]
for(int i =1; i< tamanho-1; i++){
?if(nomes[i].length()>2){
? ?abv += " "+nomes[i].charAt(0) + "."
?}else{
? ?abv += " "+nomes[i]
?}
}
abv+=" " + nomes[tamanho-1]
println abv
Recomendo um campo calculado no domínio mesmo.
Eu colocaria um getNomeAbreviado() na própria classe de domínio. Mas se você não gostar da abordagem, pode formatar o(s) nome(s) no Controller na hora de retornar essa busca.
Victor,
Se ele utilizar o getNomeAbreviado() na domain ele vai conseguir usar as CRITERIAS para buscar por pessoas através desse atributo (se ele não for persistido)?
Olá Francisco.
Eu separaria mais as coisas:
Primeiramente teria uma classe serviço (no diretório Services) com este método de abreviatura.
Agora precisamos entender qual a função da abreviação, que comportamento vc precisa no aplicativo.
Precisa persistir? Existe carga na tabela feita de forma batch? Se sim, será inevitável chamar o método dentro do Domínio. Caso contrário, poderá deixar o Controller tratar do assunto. Agora, se você quiser mostrar a abreviatura ao alterar o conteúdo do campo nomeCompleto no formulário independente de te-lo submetido, você precisará de algumas outras combinações...
Abraço
Rafael C, esse caso serve somente para exibir o valor de uma forma diferente na tela.
Se precisar utilizar o nome abreviado em consultas, acho que teria que listar todas as pessoas, abreviar o nome de cada uma para comparar com o valor consultado. Se o nome abreviado for exibido em uma coluna de dataTable na tela, você provavelmente terá que fazer algo parecido se quiser ordenar a coluna.
Se sua lista de pessoas for muito grande, você pode ficar preocupado com a performance disso e resolver salvar o nome abreviado no banco, mas aí terá outro problema: sempre que precisar alterar o nome, terá que atualizar também a abreviação. Já passei por esse dilema no caso de valores numéricos calculados (não armazenados).
Olá pessoal, desde já agradeço pela ajuda de todos, faltou informar que não vou persistir os dados, é apenas uma consulta que no final vai gerar uma etiqueta (ou várias), sendo assim tenho que controlar o tamanho dos nomes para não extrapolar o limite, consegui resolver direto no domínio com o 1° código abaixo, depois alterei no template da etiqueta com o 2º código abaixo e está indo bem, pode não ser a maneira mais elegante, mas resolveu, o código pode ser melhorado, claro, caso alguém precise segue os códigos:
1º código no domínio:
def abv(){
String[] nomearray = Nome.split()
int tamanho = nomearray.length
nomeAbv= nomearray[0]
for(int i =1; i< tamanho-1; i++){
if(nomearray[i].length()>3){ // Não abrevia "de","dos", "das", etc...
nomeAbv += " "+nomearray[i].charAt(0) + "."
}else{
nomeAbv += " "+nomearray[i]
}
}
return nomeAbv+=" " + nomearray[tamanho-1]
}
2º código no template:
Obs: Normalmente nas views e templates os resultados são marcados com <td> no meu caso usei <li>:
<li>${impressaoInstance?.abv()}</li>
Vlw!